2012-06-20 26 views
5

Tôi đang cố gắng tạo trường tự động (như SERIAL) bằng trình kích hoạt và chuỗi. Tôi biết rằng chỉ có thể sử dụng một chuỗi hoặc loại SERIAL trên sân, nhưng tôi phải giải quyết này sử dụng cả hai phương pháp (trigger và secuences)Tạo trường tự động với trình kích hoạt và trình tự trong 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(); 

tôi cố gắng kết hợp này nhưng doesnt làm việc, các alimento bảng có hai lĩnh vực chỉ, số nguyên id (autoincrement với kích hoạt và trình tự) và tên varchar.

Bất kỳ đề xuất nào?

Cảm ơn

+5

chỉ cần giải thích thêm về "nó không hoạt động". –

+2

Tại sao bạn không muốn sử dụng loại SERIAL đơn giản? –

+3

Bạn chỉ có thể gọi 'nextval()' trên chuỗi liên kết của cột 'nối tiếp' cho các mục đích khác. Không cần phải làm phức tạp những thứ với một kích hoạt. Bên cạnh đó, không có thông báo lỗi, câu hỏi của bạn chỉ là tiếng ồn. Bao gồm nó nguyên văn, xin vui lòng. –

Trả lời

6

Như những người dùng khác đã nói với bạn, bạn không cần sử dụng trình kích hoạt. Bạn có thể khai báo các bảng như thế này:

CREATE SEQUENCE AlimentosSequencia; 

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

Và khi bạn chèn một kỷ lục mới:

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

Một khả năng khác được tuyên bố là id lĩnh vực như serial type, rằng nó sẽ tạo ra các chuỗi tự động.

CẬP NHẬT: Ok, đó là bài tập. Sau đó, tôi không hiểu vấn đề là gì? Tôi đã thử nghiệm mã này:

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

Và nó hoạt động không có vấn đề gì.

+0

Tuyệt vời !!! Cảm ơn!! – jgiunta

+0

Vấn đề là khi tôi tuyên bố de ID lĩnh vực ... :(!!!! Nhưng readng câu trả lời của bạn tôi phát hiện ra vấn đề. – jgiunta

Các vấn đề liên quan