PostgreSQL中三种自增列序列,序列、身份的区别有哪些

  介绍

这篇文章主要介绍PostgreSQL中三种自增列序列,序列,身份的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

这三个对象都可以实现自增,这里从如下几个维度来看看这几个对象有哪些不同,其中功能性上看,大部分特性都是一致的或者类似的。

 PostgreSQL中三种自增列序列,序列,身份的区别有哪些

1,在序列所有数据库中的性质都一样,它是跟具体的字段不是强绑定的,其特点是支持多个对个对象之间共享。

序列作为自增字段值的时候,对表的写入需要另外单独授权序列(批准使用> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -序列- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   create  sequence  myschema.seq_1  INCREMENT  BY  1, MINVALUE  1, START  WITH  1;   create  table  myschema.test_seq   (   ,id  int  not  null  default  nextval (& # 39; myschema.seq_1& # 39;), primary 键,   ,name  varchar (10)   );   隐式插入   insert  into  myschema.test_seq (名字),values  (& # 39; aaa # 39;);   insert  into  myschema.test_seq (名字),values  (& # 39; bbb # 39;);   insert  into  myschema.test_seq (名字),values  (& # 39; ccc # 39;);   select  *,得到myschema.test_seq;   显式插入   insert  into  myschema.test_seq  (id、名称),values  (5 & # 39; ddd # 39;);   select  *,得到test_seq;   再次隐式插入   ——可以正常插入   insert  into  myschema.test_seq (名字),values  (& # 39; eee # 39;);   ——插入失败,主键重复,因为序列自身是递增的,不会关心表中被显式插入的数据   insert  into  myschema.test_seq (名字),values  (& # 39; fff& # 39;);   ——重置序列的最大值   select  setval (& # 39; myschema.seq_1& # 39; (select 马克斯(id),得到myschema.test_seq)::长整型数字);   ——事务回滚后,序列号并不会回滚   开始;   insert  into  myschema.test_seq (名字),values  (& # 39; ggg& # 39;);   回滚;   ——,truncate 表之后,序列不受影响   truncate  table  myschema.test_seq;   ——重置序列   ALTER  SEQUENCE  myschema.seq_1  RESTART  WITH  1;   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -系列- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   create  table  myschema.test_serial   (   ,id  serial  primary 键,   ,name  varchar (100)   )   select  *,得到test_serial;   insert  into  myschema.test_serial(名字),values  (& # 39; aaa # 39;);   insert  into  myschema.test_serial(名字),values  (& # 39; bbb # 39;);   insert  into  myschema.test_serial(名字),values  (& # 39; ccc # 39;);   select  *,得到myschema.test_serial;   ——显式插入,可以执行   insert  into  myschema.test_serial (id、名称),values  (5 & # 39; ccc # 39;);   ——再次隐式插入,第二次会报错,因为隐式插入的话,连环会基于显式插入之前的Id做自增,连续无法意识到当前已经存在的最大值   insert  into  myschema.test_serial(名字),values  (& # 39; xxx # 39;);   insert  into  myschema.test_serial(名字),values (& # 39;多# 39;);   select  *,得到myschema.test_serial;   ——truncate  table 后连续不会重置   truncate  table  myschema.test_serial;   insert  into  myschema.test_serial(名字),values  (& # 39; aaa # 39;);   insert  into  myschema.test_serial(名字),values  (& # 39; bbb # 39;);   insert  into  myschema.test_serial(名字),values  (& # 39; ccc # 39;);   select  *,得到myschema.test_serial;   ——验证是否会随着事务一起回滚,结论:不会   开始;   insert  into  myschema.test_serial(名字),values (& # 39;多# 39;);   回滚;   ——重置连续,需要注意的是重置的Id必须要大于相关表的字段最大Id,否则会产生重号   SELECT  SETVAL ((SELECT  pg_get_serial_sequence (& # 39; myschema.test_serial& # 39;,, & # 39; id # 39;)),, 1,,假);   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -认同- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   drop  table  myschema.test_identiy_1    create  table  myschema.test_identiy_1    (   ,id  int  generated  always  as  identity  (cache  100年,START  WITH  1, INCREMENT  BY  1), primary  key ,,   ,name  varchar (100)   );   create  table  myschema.test_identiy_2   (   ,id  int  generated  by  default  as  identity  (cache  100年,START  WITH  1, INCREMENT  by  1), primary  key ,,   ,name  varchar (100)   );   insert  into  myschema.test_identiy_1(名字),values  (& # 39; aaa # 39;);   insert  into  myschema.test_identiy_1(名字),values  (& # 39; bbb # 39;);   insert  into  myschema.test_identiy_1(名字),values  (& # 39; ccc # 39;);   insert  into  myschema.test_identiy_2(名字),values  (& # 39; aaa # 39;);   insert  into  myschema.test_identiy_2(名字),values  (& # 39; bbb # 39;);   insert  into  myschema.test_identiy_2(名字),values  (& # 39; ccc # 39;);   select  *,得到myschema.test_identiy_1;   ——显式插入值,如果定义为generated  always  as 身份则不允许显式插入,除非增加overriding  system  value 提示   ——一旦提示了overriding  system 价值,可以   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

PostgreSQL中三种自增列序列,序列、身份的区别有哪些