当前位置:  开发笔记 > 数据库 > 正文

如何在Postgres中创建SQL Server的标识列的等效项

如何解决《如何在Postgres中创建SQLServer的标识列的等效项》经验,为你挑选了1个好方法。

有一个应用程序使用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字段(默认字段)?

任何可能的原因?触发器?程序?



1> Basil Bourqu..:
TL;博士

现在在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

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有