postgres中通过触发器实现自增列


对于自增列,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

时间: 2024-11-08 22:12:38

postgres中通过触发器实现自增列的相关文章

oracle利用触发器实现自增列

oracle没有自增列功能,mysql 和 sqlserver 分别用auto_increment和identity(1,1)来实现自增.oracle要实现只能通过序列实现,每次插入的时候通过取序列的值显示的给自增列,感觉有些不方便,这里使用触发器来代替,从而使插入的时候三者数据库在语法上一致,便于DAO代码的移植.下面是ORACLE实现示例,步骤如下:                                                                        

设计表的时候,对于自增列做逻辑主键使用的一点思考

本文出处:http://www.cnblogs.com/wy123/p/7581380.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 关于自增列 自增列作为数据库的一个特性之一,在MSSQL和MySQL以及Oracle中都被支持.之前在网上发现一个类似的问题,是关于MySQL的:“为什么InnoDB表最好要有自增列做主键?”自增列作为一项特性,(可能)会应用到表的设计方面,不管是在那种数据库平台下.抛开具

程矢Oracle PowerDesigner中生成Oracle版本主键和自增列

Oracle中如何新建自增列,总的来说需要建立序列,并把这个序列付给某一列,重建触发器即可. 第一步,打开PD,新建一个PDM文档,然后新建一个表,如图所示: 第二步,创建一个序列.在[Model]-[Sequence]打开序列列表窗口,新建一个序列.然后打开序列的属性设置项[physical Options],进行如下设置,点击确定,序列建立完毕. 第三步,将刚刚创建的序列应用到表的主键列中,如图所示:点击确定, 点击确定,至此,自动创建了一个触发器,把序列的值添加到主键中.

mysql中InnoDB表为什么要建议用自增列做主键

InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的; (2)不可能在非叶子结点命中; (3)非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层; 2.如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引.如果没有显式定义主键,则InnoDB会选择第一个不包含有NU

(转)Repeater中增加序号自增列

<%# Convert.ToString(Container.ItemIndex+1)%> 当Repeater空为时,提示没有数据... <FooterTemplate> <tr style="color:Red; font-size:18px;" runat="server" Visible="<%#rpt.Items.Count==0 %>" > <td colspan="8&q

SQL Server中Id自增列的最大Id是多少

什么是自增列 在SQL Server中可以将Id列设为自增.即无需为Id指定值,由SQL Server自动给该列赋值,每新增一列Id的值加一,初始值为1. 需要注意的是即使将原先添加的所有数据都删除,然后新增数据.此时记录的Id依然不会从1开始,而是原先的最大值加1. 自增列的取值范围 一般在定义自增列时,都会指定其数据类型为int类型.而且也只有int类型及其相关数据类型的列可以指定为自增列. 下面是自增列可以使用的数据类型: bigint -2^63 (-9,223,372,036,854,

Oracle动态创建时间分区,以及Oracle12c中快速创建自增列

时间分区可以按照年月日时分秒进行分区,一般按照日或月分区就足够了,这里按照的是日分区 demo如下 create table APDEMO ( OID NUMBER(38) generated as identity (start with 1 increment by 1),--主键,自增列 REPORTTIME DATE , AP_MAC VARCHAR2(64 CHAR) , APALIASNAME VARCHAR2(128 CHAR) not null, HOTSPOTNAME VARC

pt-online-schema-change中update触发器的bug

pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KE

orcle创建自增列

刚刚用orcle,组长让我设计一张表,结果设计完了以后就在PLSQL设计主键ID,因为如果不用自增列的话就得用复合主键,所以就想着用ID的自增列来表示.可是他和SQL Server又有点不太一样,他没又自增列.所以在网上查了一下,两种方法. 方法1:触发器 首先先创建一张测试表t_demo create table t_demo ( id number(20) primary key, username varchar2(20) ) 第一步:创建squence create sequence d