2012-06-20 2 views
5

트리거 및 시퀀스를 사용하여 자동 증가 필드 (예 : SERIAL)를 만들려고합니다. 난 단지 필드에서 시퀀스 또는 SERIAL 유형을 사용할 수 있습니다,하지만 난이트리거 및 시퀀스를 사용하여 자동 증가 필드 만들기 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(); 

나는이 조합을 시도하지만 나던 작품 (트리거와 secuences를) 두 가지 방법을 사용하여 해결해야하는 것을 알고, 테이블 음식은 두 개의 필드가 있습니다 정수 ID (트리거 및 시퀀스가있는 자동 증가) 및 varchar 이름입니다.

의견이 있으십니까?

감사

+5

"작동하지 않습니다"에 대한 설명 만 추가하면됩니다. –

+2

간단한 SERIAL 유형을 사용하려는 이유는 무엇입니까? –

+3

다른 목적으로'serial' 열의 연관된 순서에서'nextval()'을 호출하면됩니다. 방아쇠로 물건을 복잡하게 할 필요가 없습니다. 그 외에, 오류 메시지없이 귀하의 질문은 단지 소음입니다. 축 어적으로 포함 시키십시오. –

답변

6

다른 사용자가 말했 듯이, 당신은 트리거를 사용할 필요가 없습니다. 이 같은 테이블을 선언 할 수

CREATE SEQUENCE AlimentosSequencia; 

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

을 그리고 당신은 새 레코드를 삽입 할 때 :

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

은 또 다른 가능성은 자동 시퀀스를 만들 것이라고 serial typeID 필드를 선언된다.

업데이트 : 좋습니다. 그렇다면 나는 그 문제가 무엇인지 이해하지 못한다. 이 코드를 테스트했습니다 :

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

그리고 문제없이 작동합니다.

+0

대단한 !!! 감사!! – jgiunta

+0

ID 필드를 선언 할 때 문제가 발생했습니다 ... :(!!!!하지만 readng을 사용하여 문제를 발견했습니다. 다시 한 번 감사드립니다. – jgiunta

관련 문제