有一个应用程序使用MSSQL作为其后端.现在我正在开发代码,以便它可以使用PostgreSQL.我差不多完成了它,除了执行时有这个区别:
保存新应用程序时,
SQL Server代码:
create table tower ( npages integer, ifnds integer, ifnid integer, name varchar(20), towid integer not null IDENTITY )
PostgreSQL代码:
create table tower ( npages integer, ifnds integer, ifnid integer, name varchar(20) )
为什么在通过PostgreSQL执行时不会自动生成towid字段(默认字段)?
任何可能的原因?触发器?程序?
现在在Postgres 10中,GENERATED BY DEFAULT AS IDENTITY
按照SQL标准指定.
create table tower ( npages integer, ifnds integer, ifnid integer, name varchar(20), towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard )标识列
Postgres 10现在支持标识列的概念,并使用标准的SQL语法.虽然我不是MS SQL Server的专家,但我相信这种新的标准支持是等效的.
GENERATED … AS IDENTITY
在GENERATED … AS IDENTITY
使用期间使用的命令CREATE TABLE
创建隐式序列.与您相比,该序列的创建,命名,权限和删除对您来说是透明的SERIAL
.现在非常直观.如果您授予表的使用权限,则他们将获得序列的权限.如果删除表,则会自动删除序列.
两种标准语法.只有传递值而不是生成值时,差异才有意义.通常,人们总是依赖于生成的值,因此通常只需使用第一个版本GENERATED BY DEFAULT AS IDENTITY
.
GENERATED BY DEFAULT AS IDENTITY
除非INSERT
命令提供值,否则生成值.
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 -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
目的是为了向您隐藏内部实现细节.您无需知道正在生成的序列的名称.例如,您可以通过列重置计数器,而无需了解基础序列.
ALTER TABLE person_ ALTER COLUMN id_ RESTART WITH 1000 -- Reset sequence implicitly, without a name. ;
隐式指定身份:
标记列 NOT NULL
创建一个序列
序列类型与列匹配(32位64位等)
将序列绑定到列
继承权限
瀑布落下
即使重命名列,仍会保留与列关联
将序列指定为该列的默认值的来源
标识列可以采用相同的选项CREATE SEQUENCE
:
START WITH start
MINVALUE minvalue
| NO MINVALUE
MAXVALUE maxvalue
| NO MAXVALUE
INCREMENT [ BY ] increment
CYCLE
| NO CYCLE
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