在 table 级别和列级别添加 PRIMARY KEY 约束有什么区别?

What's the difference between adding PRIMARY KEY constraint on table level and on column level?

如问题标题所述,我们可以在列级别添加PRIMARY KEY约束:

animals=# CREATE TABLE temp (
id serial UNIQUE PRIMARY KEY);
CREATE TABLE
animals=# \d temp
                            Table "public.temp"
 Column |  Type   | Collation | Nullable |             Default
--------+---------+-----------+----------+----------------------------------
 id     | integer |           | not null | nextval('temp_id_seq'::regclass)
Indexes:
    "temp_pkey" PRIMARY KEY, btree (id)

或table级别:

animals=# CREATE TABLE temp_1 (
id serial UNIQUE,
PRIMARY KEY (id));
CREATE TABLE
animals=# \d temp_1
                            Table "public.temp_1"
 Column |  Type   | Collation | Nullable |              Default
--------+---------+-----------+----------+------------------------------------
 id     | integer |           | not null | nextval('temp_1_id_seq'::regclass)
Indexes:
    "temp_1_pkey" PRIMARY KEY, btree (id)

谢谢。

完全没有区别。
名称本身 PRIMARY KEY 表明它不是在单个列级别上定义的东西。

你所说的"on column level"其实只是主键在单列时的一种方便的语法。

顺便说一句,主键表示 NOT NULL UNIQUE,因此您可以跳过将它们定义为 UNIQUE

  • 主键和唯一键都是实体完整性约束,在很多方面都是相似的。但是,在编程方面,他们有很多不同之处。两者都是主要用于数据库管理系统的基本概念。

  • 主键是数据库table的一个或多个columns/fields的集合,它唯一标识table中的一条记录。另一方面,唯一键防止两个记录在列中具有相同的值。

  • 从概念上讲,给定的 table 只能有一个 PRIMARY KEY,而 table.

    可以有多个 UNIQUE KEY
  • 主键必须是唯一的,但唯一键不一定是主键。

  • 主键不能在 table 中接受 NULL 值,而唯一键可以允许 NULL 值,但 table 中只有一个 NULL 除外。

您可以参考文章:http://covelign.com/3Y8P