PostgreSQL中三个自增列序列、序列、身份标识的用
  • 作者:admin
  • 发表时间:2021-04-28 07:51
  • 来源:未知

这三个对象可以实现自我增值。在这里,我们将从以下几个方面来看这些对象之间的差异,其中大多数功能在功能上是一致或相似的。

1.所有数据库中序列的性质都是相同的。它并不强烈地绑定到特定的字段,它的特点是支持几对对象之间的共享。

当sequence用作自增字段值时,表的写入需要由sequence单独授权(在sequence test _ old _ id _ seq上授权使用;)

序列型字段表,当使用create table new _ table类似old _ table时,新表的自添加字段将长期指向原表的序列

结论:

对于自加字段,顺序不适合作为“自加栏”,是没有特殊要求的最后选择。

2.身份的本质是新添加的,以与标准sql中的语法兼容,它修复了一些串行缺陷,如无法通过alter table添加或删除串行字段

2.1身份被定义为默认生成,因为身份也允许显式插入。

2.2身份被定义为始终身份,覆盖系统值也可以显式不插入

结论:

Identity是serial的“增强版”,更适合作为“自加栏”使用。

3.序列、序列和标识的共同缺点是,在显式插入后,自增量不能更新到表中的最大标识,这是再次显式插入时潜在的自增量字段标识冲突

结论:

自增列必须在显式插入后手动重置为表的最大标识。

4.自加字段的更新没有仔细研究。相对来说,显式插入自加列是一个常规操作。只要自增列的更新操作没有问题,一般是不做的。

原稿,懒得整理,不涉及原理的东西,开始重新尝试理解。

-序列-

创建序列myschema.seq_1增量1最小值1从1开始;

创建表myschema.test_seq

id int不为null默认nextval('myschema.seq_1 ')主键,

姓名varchar(10)

);

隐式插入

插入myschema.test_seq (name)值(' AAA ');

插入myschema.test_seq (name)值(' BBB ');

插入myschema.test_seq (name)值(' CCC ');

从myschema.test_seq中选择*

显式插入

插入myschema.test_seq (id,name)值(5,' DDD ');

从test_seq中选择*

再次隐式插入

-可以正常插入

插入myschema.test_seq (name)值(' eee ');

-插入失败,主键重复,因为序列本身是增量的,不会关心表中显式插入的数据

插入myschema.test_seq (name)值(' fff ');

-重置序列的最大值

选择setval('myschema.seq_1 ',(从myschema.test_seq中选择max(id): BIGINT);

-事务回滚后,序列号不会回滚

开始;

插入myschema.test_seq (name)值(' GGG ');