2012-06-20 14 views
5

Estoy intentando crear un campo de autoincremento (como SERIAL) utilizando un desencadenador y una secuencia. Sé que sólo puede utilizar una secuencia o tipo serie en el campo, pero tengo que resolver esto utilizando ambos métodos (disparadores y secuences)Crear campo de autoincrement con desencadenador y secuencia en Postgres

CREATE SEQUENCE AlimentosSequencia; 

CREATE OR REPLACE FUNCTION AlimentoFuncion() 
    RETURNS "trigger" AS 
$BODY$ 
    BEGIN 
     New.id:=nextval('AlimentosSequencia'); 
     Return NEW; 
    END; 
$BODY$ 

LANGUAGE 'plpgsql' VOLATILE; 

CREATE TRIGGER AlimentosTrigger 
    BEFORE INSERT 
    ON alimento 
    FOR EACH ROW 
    EXECUTE PROCEDURE AlimentoFuncion(); 

que probar esta combinación, pero dosis no funciona, el apoyo alimentario tabla tiene dos campos solo, ID entero (el autoincremento con disparador y secuencia) y el nombre varchar.

¿Alguna sugerencia?

Gracias

+5

acaba de dar una explicación más de "no funciona". –

+2

¿Por qué no quieres usar el tipo de SERIAL simple? –

+3

Puede llamar a 'nextval()' en la secuencia asociada de una columna 'serial' para otros fines. No hay necesidad de complicar las cosas con un disparador. Aparte de eso, sin mensaje de error, tu pregunta es solo ruido. Incluirlo textualmente, por favor. –

Respuesta

6

Como otros usuarios han dicho, no es necesario utilizar un disparador. Se puede declarar la tabla siguiente manera:

CREATE SEQUENCE AlimentosSequencia; 

CREATE TABLE alimento (
    id integer NOT NULL DEFAULT nextval('AlimentosSequencia') PRIMARY KEY 
,name VARCHAR(255)); 

Y cuando se inserta un nuevo registro:

INSERT INTO alimento (name) VALUES ('lemon'); 

Otra posibilidad es declarado el campo Identificación como serial type, que crearía la secuencia automática.

ACTUALIZACIÓN: Ok, es un ejercicio. Entonces no entiendo cuál es el problema? He probado este código:

CREATE SEQUENCE AlimentosSequencia; 

CREATE TABLE alimento (
    id integer NOT NULL PRIMARY KEY 
,name VARCHAR(255)); 

CREATE OR REPLACE FUNCTION AlimentoFuncion() 
RETURNS "trigger" AS 
$BODY$ 
BEGIN 
    New.id:=nextval('AlimentosSequencia'); 
    Return NEW; 
END; 
$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 

CREATE TRIGGER AlimentosTrigger 
BEFORE INSERT 
ON alimento 
FOR EACH ROW 
EXECUTE PROCEDURE AlimentoFuncion(); 

INSERT INTO alimento (name) VALUES ('lemon'); 

Y funciona sin problemas.

+0

¡¡¡Genial !!! ¡¡Gracias!! – jgiunta

+0

El problema fue cuando declaré el campo ID ... :(! Pero leyendo tu respuesta detecto el problema. Gracias de nuevo – jgiunta

Cuestiones relacionadas