2012-06-20 6 views
5

Próbuję utworzyć pole autorekrecji (np. SERIAL) za pomocą wyzwalacza i sekwencji. Wiem, że można używać tylko sekwencję lub szeregowego typu na polu, ale muszę rozwiązać ten problem za pomocą obu metod (wyzwalacze i secuences)Utwórz pole autocenzury z wyzwalaczem i sekwencją w Postgresie

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

staram tej kombinacji, ale nie robi zadziała, alimento tabela ma dwa pola only, integer id (autoinkrement z wyzwalaczem i sekwencją) i nazwa varchar.

Jakieś sugestie?

Dzięki

+5

wystarczy podać więcej wyjaśnień "to nie działa". –

+2

Dlaczego nie chcesz użyć prostego typu SERIAL? –

+3

Możesz po prostu wywołać 'nextval()' na powiązanej sekwencji kolumny 'serial' dla innych celów. Nie trzeba komplikować rzeczy za pomocą wyzwalacza. Poza tym, bez komunikatu o błędzie, twoje pytanie jest po prostu szumem. Dołącz to dosłownie, proszę. –

Odpowiedz

6

Jak informowali inni użytkownicy, nie trzeba używać wyzwalacza. Można zadeklarować tablicę tak:

CREATE SEQUENCE AlimentosSequencia; 

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

A po wstawieniu nowego rekordu:

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

Inną możliwością jest ogłoszony pole id jako serial type, że byłoby utworzyć sekwencję automatycznie.

AKTUALIZACJA: OK, to ćwiczenie. Wtedy nie rozumiem, o co chodzi? Przetestowałem ten kod:

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

I działa bez problemów.

+0

Świetnie !!! Dzięki!! – jgiunta

+0

Problem polegał na tym, że zadeklarowałem pole de ID ... :(!!!! Ale odczytaj odpowiedź i wykryję problem. Jeszcze raz dziękuję – jgiunta

Powiązane problemy