【问题标题】:Create an automatically increasing primary key column in PostgreSQL在 PostgreSQL 中创建一个自动增加的主键列
【发布时间】:2023-04-01 11:42:01
【问题描述】:

我正在关注CREATE TABLE中的示例:

CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name <> '')
);

但是,它给了我错误:在“GENERATED”或附近出现语法错误。为什么会这样,我应该如何解决?

  • \! psql -V 返回 psql (PostgreSQL) 10.5 (Ubuntu 10.5-1.pgdg14.04+1)
  • SELECT version(); 在 x86_64-pc-linux-gnu (Ubuntu 9.4.19-1.pgdg14.04+1) 上返回 PostgreSQL 9.4.19,由 gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8 编译.4、64 位

编辑:

感谢@muistooshort,我检查了the 9.4 docs。所以我执行:

CREATE TABLE distributors (
     did    integer PRIMARY KEY DEFAULT nextval('serial'),
     name   varchar(40) NOT NULL CHECK (name <> '')
);

尽管如此,它现在给了我错误:关系“序列”不存在...

【问题讨论】:

  • psql 来自 PostgreSQL 10.5 但服务器运行的是哪个版本的 PostgreSQL?
  • @muistooshort SELECT version(); 给了我 PostgreSQL 9.4.19 on x86_64-pc-linux-gnu (Ubuntu 9.4.19-1.pgdg14.04+1),由 gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4)4.8.4,64位。这是否意味着我应该阅读 9.4 版而不是 10 版的文档?
  • 是的,请查看 9.4 文档。 AFAIK IDENTITY 是在版本 10 中添加的,您需要在 9.4 中使用 serial
  • @muistooshort 我刚刚尝试过,但又失败了。你介意检查我的编辑吗?我是否应该创建关系serial 只是为了创建distributors
  • 我需要比评论提供更多的空间,所以我添加了一个答案。

标签: postgresql create-table


【解决方案1】:

在 PostgreSQL 10 中添加了 SQL 标准 IDENTITY,但您的服务器(完成所有实际工作)是 9.4。在 10 之前你必须使用 serialbigserial 类型:

CREATE TABLE distributors (
     did    serial not null primary key,
     name   varchar(40) NOT NULL CHECK (name <> '')
);

serial type 将创建一个序列来提供值,将序列附加到表中,并为did 连接一个默认值以从序列中获取值。

【讨论】:

  • 谢谢,这行得通!只是出于好奇,为什么 9.4 文档中提供的示例不起作用呢?
  • 也许你读错了文档。 serial 所以它替换了 integernextval 将序列名称作为其参数,但 serial 伪类型为您提供默认值。
  • 我认为可能是这样,但我确实复制并粘贴了该文档中的示例......
  • 该示例不完整,有时文档会遗漏一些内容以避免混淆他们试图向您展示的内容。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多