我正在尝试添加一个带有自动增量的主键。
我已阅读了一些文档和其他问题 - 有SERIAL
和nextval()
语句,但它不起作用。
这就是我所做的:
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。
答案 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;