2012-06-20 9 views
5

sto provando a creare un campo di autoincremento (come SERIAL) utilizzando un trigger e una sequenza. So che solo può utilizzare una sequenza o di tipo seriale sul campo, ma devo risolvere questo utilizzando entrambi i metodi (trigger e secuences)Crea campo autoincrement con trigger e sequenza in 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(); 

provo questa combinazione, ma dose non funziona, l'alimento tabella ha due campi solo, intero id (l'autoincrement con trigger e sequenza) e il nome varchar.

Qualche suggerimento?

Grazie

+5

basta dare qualche spiegazione in più su "non funziona". –

+2

Perché non si desidera utilizzare il semplice tipo SERIAL? –

+3

È possibile chiamare 'nextval()' nella sequenza associata di una colonna 'serial' per altri scopi. Non c'è bisogno di complicare le cose con un grilletto. A parte questo, senza un messaggio di errore, la tua domanda è solo rumore. Includilo verbatim, per favore. –

risposta

6

Come altri utenti hanno detto, non è necessario utilizzare un trigger. È possibile dichiarare la tabella come questa:

CREATE SEQUENCE AlimentosSequencia; 

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

E quando si inserisce un nuovo record:

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

Un'altra possibilità è dichiarato il id campo come serial type, che avrebbe creato la sequenza automaticamente.

UPDATE: Ok, è un esercizio. Quindi non capisco qual è il problema? Ho provato questo codice:

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'); 

E funziona senza problemi.

+0

Grande !!! Grazie!! – jgiunta

+0

Il problema è stato quando ho dichiarato il campo ID ... :(!!!! Ma leggendo la tua risposta rilevo il problema. Grazie ancora – jgiunta

Problemi correlati