如何创建与SQL Server';Postgres中的s标识列

如何创建与SQL Server';Postgres中的s标识列,sql,postgresql,auto-increment,Sql,Postgresql,Auto Increment,有一个应用程序使用MSSQL作为其后端。现在我正在开发代码,以便它可以使用PostgreSQL。我几乎完成了它,但执行时有一个区别: 保存新应用程序时, SQL Server代码: create table tower ( npages integer, ifnds integer, ifnid integer, name varchar(20), towid integer not null IDENTITY ) PostgreSQL代码: create tab

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


有什么可能的原因吗?触发器?过程?

PostgreSQL将完全按照您的要求创建表。它不会自动生成某些列(几乎,但这是低级的)。您需要在请求中添加
towid串行主键

tl;博士 现在在Postgres 10中,根据SQL标准将默认生成的
指定为IDENTITY

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的概念,并使用标准SQL语法。虽然我不是MS SQL Server方面的专家,但我相信这种新的标准支持是等效的

已生成…作为标识
CREATE TABLE
期间使用的
GENERATED…AS IDENTITY
命令创建隐式序列。该序列的创建、命名、权限和删除对您来说是透明的,这与
SERIAL
不同。现在非常直观。如果您向表授予使用权限,则它们将获得序列的权限。如果删除表格,序列将自动删除

标准语法的两种风格。只有在传递值而不是生成值时,差异才起作用。通常,人们总是依赖于生成的值,因此通常只需使用第一个版本,
默认生成为IDENTITY

  • 默认生成为标识
    • 生成值,除非
      INSERT
      命令提供值
  • 始终作为标识生成
    • 忽略
      INSERT
      提供的任何值,除非指定
      覆盖系统值
有关文档,请参见页面

彼得·艾森特阅读。他解释了一些关于
SERIAL
的奇怪问题。新的标识列功能没有此类问题。因此,没有理由再使用
串行
,没有缺点,只有优点
串行
生成的…身份取代

请注意,标识列不一定是主键,也不会自动编制索引。因此,如果这是您的意图,您仍然需要显式地指定
主键
(通常是这样)

CREATE TABLE person\u(
身份证
整数
默认情况下作为标识生成--替换序列。隐式创建一个序列,指定为默认序列。
主键--创建索引。指定唯一。标记关系的列。
,
姓名
瓦查尔(80)
) ;
其目的是对您隐藏内部实现细节。您无需知道封面下生成的序列的名称。例如,您可以通过列重置计数器,而不知道底层序列

ALTER TABLE person_ 
    ALTER COLUMN id_ 
    RESTART WITH 1000      -- Reset sequence implicitly, without a name.
;
隐式指定标识:

  • 标记列
    不为空
  • 创建一个序列
    • 序列类型与列匹配(32位64位等)
  • 将序列绑定到列
    • 继承权限
    • 瀑布下降
    • 即使已重命名列,仍与列绑定
  • 指定序列作为该列默认值的源
标识列可以采用与以下相同的选项:

  • START WITH START
  • MINVALUE-MINVALUE
    |
    NO-MINVALUE
  • MAXVALUE-MAXVALUE
    |
    无MAXVALUE
  • 增量[按]增量
  • 循环
    |
    无循环
  • 缓存
    缓存
  • 无所有

    (为标识列指定所有权对我来说没有意义,因为所有权是自动管理的)
选项的简单示例:

id_ INTEGER 
GENERATED BY DEFAULT AS IDENTITY ( 
    START WITH 200 
    MINVALUE 100 
    MAXVALUE 205 
    CYCLE 
    INCREMENT BY 3 
) PRIMARY KEY
添加4行:

二百

203

一百

103


好啊但是SQL没有简单的代码来生成towid字段。。。它是由一个过程还是什么产生的?@AnuShibinJosephRaj:
serial
等同于
identity
。有关详细信息,请参阅手册:PostgreSQL类型
serial
bigserial
可以很好地替代T-SQL中的
IDENTITY
类型。它们保证了独特的价值观,并提供了可理解的价值观。身份有时会表现得有点怪异……更新:Postgres 10获得了对标准语法的支持,
生成了……作为身份
。除了作为标准的SQL之外,这个新特性还修复了串行数据的一些奇怪问题。阅读2017-04。在Postgres中使用
towid serial not null