【问题标题】:PostgreSQL 9.1 primary key autoincrementPostgreSQL 9.1 主键自增
【发布时间】:2013-12-26 07:43:01
【问题描述】:

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

我已经阅读了一些文档和其他问题 - 有 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。

【问题讨论】:

  • 您将“id”定义为 INTEGER 然后 SERIAL。 SERIAL 是一种数据类型。 PostgreSQL 会为你创建一个 SEQUENCE。您只需要删除 INTEGER。
  • 添加PK前表格已填满数据?

标签: sql postgresql


【解决方案1】:

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" 将是同一件事,但不必要的引用是一个坏习惯,很容易导致到处都是大写的引号。

【讨论】:

  • 如何在序列和主字段中定义不为空? Id INT NOT NULL SERIAL PRIMARY KEY 对吗?
  • @Shesha:id serial not null primary keyserial 或多或少是一种为您处理 intdefault nextval... 内容的列类型。
【解决方案2】:

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

ALTER TABLE table_name ADD COLUMN pk_column_name SERIAL PRIMARY KEY;

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 2018-12-31
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多