简述
在Postgres 10中,可以按照SQL标准指定 GENERATED BY DEFAULT AS IDENTITY
。
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY
)
自增列
Postgres 10 现在支持标准 SQL 语法的 自增列。虽然我不是 MS SQL Server 的专家,但我相信这个新的标准支持是等价的。
GENERATED … AS IDENTITY
在 CREATE TABLE
中使用 GENERATED … AS IDENTITY
命令会创建一个隐式序列。创建、命名、权限和删除该序列对您来说是透明的,与 SERIAL
不同。现在非常直观了。如果您给表授予权限,则它们将获得序列的访问权限。如果您删除表,则序列将自动删除。
有两种标准语法,区别只有在传递值而不是生成值时才有意义。通常,人们总是依赖于生成的值,因此通常您只需要使用第一个版本:GENERATED BY DEFAULT AS IDENTITY
。
GENERATED BY DEFAULT AS IDENTITY
GENERATED ALWAYS AS IDENTITY
- 忽略由
INSERT
提供的任何值,除非指定 OVERRIDING SYSTEM VALUE
请参见CREATE TABLE
页面进行文档编写。
阅读 Peter Eisentraut 的这篇有趣的文章。他解释了一些关于 SERIAL
的奇怪问题。使用新的自增列功能就没有这样的问题了。因此现在没有理由再使用 SERIAL
,没有缺点,只有好处;SERIAL
已被GENERATED … AS IDENTITY
取代。
请注意,自增列不一定是主键,并且不会自动索引。因此,如果您的意图是这样的话,仍然需要明确指定 PRIMARY KEY
。
CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY
,
name_
VARCHAR( 80 )
) ;
这是为了隐藏内部实现细节,无需您知道在幕后生成的序列名称。例如,您可以通过列重置计数器,而不必知道底层序列。
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000
;
隐式指定身份:
- 标记列
NOT NULL
- 创建序列
- 将序列绑定到该列上
- 继承权限
- 级联删除
- 即使重命名列,也仍然绑定到该列上
- 将序列指定为该列的默认值来源
身份列可以采用与CREATE SEQUENCE
相同的选项:
START WITH start
MINVALUE minvalue
| NO MINVALUE
MAXVALUE maxvalue
| NO MAXVALUE
INCREMENT [ BY ] increment
CYCLE
| NO CYCLE
CACHE
cache
OWNED BY NONE
(为身份列指定所有权对我来说没有意义,因为所有权是自动管理的)
选项的荒谬示例:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
添加4行:
200
203
100
103
towid serial not null
:https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL - user330315