【问题标题】:Auto increment table column自动递增表列
【发布时间】:2012-04-10 03:20:45
【问题描述】:

使用 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

知道为什么吗?

【问题讨论】:

  • 您使用哪个数据库? “自动增量”仅存在于少数。例如,在 Oracle 中,您需要创建一个 SEQUENCE

标签: sql postgresql types auto-increment database-table


【解决方案1】:

Postgres 10 或更高版本

serial 列(见下文)保持不变。但是考虑一个 IDENTITY 列。 Postgres 10 实现了这个标准的 SQL 特性。

manual for CREATE TABLE 中的基本语法和信息。
详细解释在此blog entry of its primary author Peter Eisentraut.

创建带有IDENTITY列的表

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

添加 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;

相关:

替换 serialIDENTITY

见:

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 让您的生活更轻松。

【讨论】:

  • 非常感谢您的帮助!
  • 欧文,你是救命稻草!
【解决方案2】:

您无需指定使用的 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】:

    在 SQL server 数据库中,您可以像这样使用Identity(1,1)

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

    【讨论】:

      【解决方案4】:

      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)
      

      【讨论】:

        猜你喜欢
        • 2016-03-07
        • 2014-04-15
        • 2014-10-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多