自动增量表列

时间:2012-03-26 15:42:41

标签: 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)
);

错误:

********** Error **********
ERROR: syntax error at or near "AUTO_INCREMENT"
SQL state: 42601
Character: 63

知道为什么吗?

4 个答案:

答案 0 :(得分:67)

Postgres 10或更高版本

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

CREATE TABLE staff (
   staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
 , staff    text NOT NULL
);

manual for CREATE TABLE中的基本语法和信息 此blog entry of its primary author Peter Eisentraut.

中的详细说明

添加 IDENTITY列到预先存在的表格(不论是否填充了行):

ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY;

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

ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY;

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

ERROR: column "staff_id" contains null values

这与Postgres 10.2有关。详细说明:

Postgres 9.6或更早

改为使用serial pseudo data type

CREATE TABLE staff (
   staff_id serial PRIMARY KEY,
 , staff    text NOT NULL
);

它自动创建并附加序列对象,并将DEFAULT设置为序列中的nextval()。它可以满足您的所有需求。

我的示例中也只使用了lower case identifiers。使用Postgres让您的生活更轻松。

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

答案 1 :(得分:1)

在SQL Server数据库中,您可以使用Identity(1,1),如下所示:

CREATE TABLE Staff
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(40) NOT NULL,
    PRIMARY KEY (ID)
);

答案 2 :(得分:1)

您没有指定您使用的是哪个RDBMS,但是,在SQL Server中您可以使用以下语法:

CREATE TABLE [dbo].[Staff]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] VARCHAR(40) NOT NULL,
CONSTRAINT [ID] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

答案 3 :(得分:0)

PostgreSQL:如果你必须拥有自己的自动增量值:

然后使用序列:

ericlesc_schools=> drop table yar;
DROP TABLE
ericlesc_schools=> drop sequence user_id_seq;
DROP SEQUENCE
ericlesc_schools=> create sequence user_id_seq;
CREATE SEQUENCE
ericlesc_schools=> create table yar(
                   id int default nextval('user_id_seq'), 
                   foobar varchar);
CREATE TABLE
ericlesc_schools=> insert into yar (foobar) values('hey alex');
INSERT 0 1
ericlesc_schools=> insert into yar (foobar) values('hey what derick');
INSERT 0 1
ericlesc_schools=> insert into yar (foobar) values('I look like a hushpuppy');
INSERT 0 1

ericlesc_schools=> select * from yar;
 id |     foobar      
----+-----------------
  1 | hey alex
  2 | hey what derick
  3 | I look like a hushpuppy
(3 rows)