自动增量表列

Jim*_*mmy 29 sql postgresql types auto-increment database-table

使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.

CREATE TABLE Staff   (
  ID        INTEGER NOT NULL AUTO_INCREMENT,
  Name      VARCHAR(40) NOT NULL,
  PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)

错误:

********** Error **********
ERROR: syntax error at or near "AUTO_INCREMENT"
SQL state: 42601
Character: 63
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

Erw*_*ter 73

Postgres 10或更高版本

serial列(见下文)保持不变.但考虑一个IDENTITY专栏.Postgres 10实现了这个标准SQL功能.

CREATE TABLE staff (
   staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
 , staff    text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

手册CREATE TABLE中的基本语法和信息.主要作者Peter Eisentraut的博客文章中的
详细说明.


添加IDENTITY列到预先存在的表(填充有行或不):

ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)

同时也使它成为PK(表还没有PK):

ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)

早期版本中存在一个错误,可能会导致错误消息,例如:

ERROR: column "staff_id" contains null values
Run Code Online (Sandbox Code Playgroud)

这与Postgres 10.2一起修复.细节:

Postgres 9.6或更高版本

改为使用serial伪数据类型:

CREATE TABLE staff (
   staff_id serial PRIMARY KEY,
 , staff    text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

它自动创建并附加序列对象,并从序列中设置DEFAULTto nextval().它可以满足您的一切需求.

我在我的例子中也只使用了小写标识符.使Postgres的生活更轻松.

最好使用描述性列名."id"作为名称是反模式,由一些中间件使用,但几乎不具有描述性.与"name"相似.