postgres中通過觸發器實現自增列
阿新 • • 發佈:2019-01-27
對於自增列,SQLServer中有identity屬性。MySQL中有auto_increment
對於postgresql中,應該如何實現呢?
postgresql的manual給了serial型別
CREATE TABLE tablename1 ( colname SERIAL );
或者
CREATE SEQUENCE tablename2_colname_seq; CREATE TABLE tablename2 ( colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') ); ALTER SEQUENCE tablename2_colname_seq OWNED BY tablename2.colname;
通過查看錶的定義可知,上述兩種方式的效果完全一致。serial型別其實就是interger的基礎上添加了某些屬性而已。
postgres=# \d tablename1 Table "public.tablename1" Column | Type | Modifiers ---------+---------+-------------------------------------------------------------- colname | integer | not null default nextval('tablename1_colname_seq'::regclass) postgres=# \d tablename2 Table "public.tablename2" Column | Type | Modifiers ---------+---------+-------------------------------------------------------------- colname | integer | not null default nextval('tablename2_colname_seq'::regclass)
用serial實現的自增列通過設定defalut屬性值的方式實現自增。所以,一旦使用者對自增列顯示的插入值(無論任何值),default屬性都不會再起作用。
這個式樣本身沒有什麼問題,但有部分使用者希望 向自增列顯示的插入NULL值時,自增列也能插入default的值而不是報錯。
例:
postgres=# insert into tablename1 values(null);
ERROR: 列"colname"內のNULL値はNOT NULL制約違反です (10284)
DETAIL: 失敗した行は(null)を含みます
為滿足在顯示的插入null值時,自增列能插入default的值而不是報錯,可以通過觸發器的方式實現自增列功能。
實現程式碼如下:
CREATE SEQUENCE SampleTbl_ID_seq;
CREATE TABLE SampleTbl (ID integer NOT NULL primary key , ITEM_1 NVARCHAR (20) COLLATE "C",ITEM_2 DATE NOT NULL, ITEM_3 BOOLEAN DEFAULT('t'));
CREATE OR REPLACE FUNCTION check_id_insert() RETURNS trigger AS $BODY$
BEGIN
NEW.ID := nextval('SampleTbl_ID_seq');
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER check_insert
BEFORE INSERT ON SampleTbl
FOR EACH ROW
WHEN (NEW.ID IS NULL)
EXECUTE PROCEDURE check_id_insert();
ALTER SEQUENCE SampleTbl_ID_seq OWNED BY SampleTbl.ID;
向表sampletbl的id列插入null時,id列自動插入sequence的值。
postgres=# insert into sampletbl values(null,'cf','1988-09-20',true);
INSERT 0 1
postgres=# select * from sampletbl;
id | item_1 | item_2 | item_3
----+--------+------------+--------
1 | cf | 1988-09-20 | t
(1 rows)
有關postgresql的觸發器功能,可以參照以下內容:
http://blog.csdn.net/neo_liu0000/article/details/6255623
http://www.postgresql.org/docs/9.4/static/sql-createtrigger.html