最好在PostgreSQL中使用SERIAL PRIMARY KEY或GENERATED ALWAYS AS IDENTITY作为主键

问题描述

不确定哪个选项是最新的最佳实践?我在本教程上读到以下内容

https://www.postgresqltutorial.com/postgresql-identity-column/

Postgresql版本10引入了新约束GENERATED AS IDENTITY,可让您自动一个 列。

GENERATED AS IDENTITY约束符合sql标准 好的旧SERIAL列的变体。

在示例中,他们使用身份作为主键:

CREATE TABLE color (
    color_id INT GENERATED ALWAYS AS IDENTITY,color_name VARCHAR NOT NULL
);

当您按照以下内容引用此表的FOREIGN KEY时:

CREATE TABLE pallet (
    id INT GENERATED ALWAYS AS IDENTITY,color_1 REFERENCES color
    color_2 REFERENCES color
);

是否知道身份现在是主键?:

解决方法

是否知道身份现在是主键?

否(serial也不会这样做)。

您需要明确定义主键:

CREATE TABLE color (
    color_id INT  primary key GENERATED ALWAYS AS IDENTITY,color_name VARCHAR NOT NULL
);

不确定哪个选项是最新的最佳实践?

建议使用identity代替serial

Quote from the Postgres Wiki

对于新应用程序,应改为使用标识列。

为什么不串行?
串行类型具有一些奇怪的行为,这些行为使架构,依赖关系和权限管理变得不必要地麻烦。

最后,标识列符合SQL标准,而serial是PostgreSQL方言。