PostgreSQL 9.1主键自动增量

时间:2013-12-26 07:43:02

标签: sql postgresql

我正在尝试添加一个带有自动增量的主键。

我已阅读了一些文档和其他问题 - 有SERIALnextval()语句,但它不起作用。

这就是我所做的:

CREATE TABLE IF NOT EXISTS "category" (
  "id" integer SERIAL PRIMARY KEY,
  "name" varchar(30) DEFAULT NULL
); // the error near "SERIAL"

CREATE SEQUENCE your_seq;
CREATE TABLE IF NOT EXISTS "category" (
  "id" integer PRIMARY KEY nextval('your_seq'),
  "name" varchar(30) DEFAULT NULL
); // the error near 'nextval'

我错了什么?我只想将主键增加1。

2 个答案:

答案 0 :(得分:85)

serial或多或少是列类型,所以说integer serial就像在说text text,只说serial

CREATE TABLE IF NOT EXISTS "category" (
  "id" SERIAL PRIMARY KEY,
  "name" varchar(30) DEFAULT NULL
);

如果您想自己创建序列,那么您希望将id的默认值设为序列中的下一个值,这意味着说default nextval('your_seq')

CREATE SEQUENCE your_seq;
CREATE TABLE IF NOT EXISTS "category" (
  "id" integer PRIMARY KEY default nextval('your_seq'),
  "name" varchar(30) DEFAULT NULL
);

要模拟通常的serial行为,您还需要使表格拥有该序列:

alter sequence your_seq owned by category.id;

阅读手册的Serial Types部分可能会很有成效。


除非必须,否则我建议您不要双重引用表名和列名。 PostgreSQL会将您的标识符折叠为小写,因此id"id"将是相同的东西,但不必要的引用是一个坏习惯,很容易导致各地的大量报价混乱。

答案 1 :(得分:2)

如果有人需要修改现有表以添加具有自动增量的主键:

ALTER TABLE table_name ADD COLUMN pk_column_name SERIAL PRIMARY KEY;