'serial' 列是否自动成为 PostgreSQL 中的主键?
Is a 'serial' column automatically a primary key in PostgreSQL?
我在 Postgres 中创建了以下 table...
create table printq (
model varchar(20),
session integer,
timestamp timestamp DEFAULT now(),
id serial);
它似乎完全符合我的需要...它会自动递增 id 列,当我使用 truncate "RESTART IDENTITY" 清除 table 时,它会重置序列(这就是为什么我首先重建了 table——id 列用于在截断时不重新启动)
无论如何,当我在 table 上执行 \d 时,我没有看到任何关于主键的信息。
Table "public.printq"
Column | Type | Modifiers
-----------+-----------------------------+-----------------------------------------------------
model | character varying(20) |
session | integer |
timestamp | timestamp without time zone | default now()
id | integer | not null default nextval('printq_id_seq'::regclass)
三个问题:
ID 列是否已经是主键,因为它会自动递增?
如果不是,为什么这个 table 需要一个主键,因为它看起来工作正常?我知道基本上每个 table 都应该有一个主键,但究竟为什么?
最后,\d 命令会告诉我这个 table 是否有主键吗?如果没有,会告诉我什么?
- 不,为此使用
id serial primary key
。
- 嗯,table 实际上 "need" 不是主键。它可以在没有 PK 的情况下存在,它可以在没有自动递增字段的情况下存在,它可以包含重复的行。但是在关系理论中(SQL 建立在其之上)每个关系(即 table)是一组(在数学意义上)行。所以重复的行是不允许的,它们在集合中是不可能的。因此每个关系都有一个字段(或几个字段),它对所有关系都有唯一的值。该字段可用于唯一标识一行,其中一个可能的唯一键称为主键。
这样的键通常对于识别行非常有用,这就是为什么 tables 应该有它们。但从技术上讲,它们不是必需的。
- 是的,会的。
我在 Postgres 中创建了以下 table...
create table printq (
model varchar(20),
session integer,
timestamp timestamp DEFAULT now(),
id serial);
它似乎完全符合我的需要...它会自动递增 id 列,当我使用 truncate "RESTART IDENTITY" 清除 table 时,它会重置序列(这就是为什么我首先重建了 table——id 列用于在截断时不重新启动)
无论如何,当我在 table 上执行 \d 时,我没有看到任何关于主键的信息。
Table "public.printq"
Column | Type | Modifiers
-----------+-----------------------------+-----------------------------------------------------
model | character varying(20) |
session | integer |
timestamp | timestamp without time zone | default now()
id | integer | not null default nextval('printq_id_seq'::regclass)
三个问题:
ID 列是否已经是主键,因为它会自动递增?
如果不是,为什么这个 table 需要一个主键,因为它看起来工作正常?我知道基本上每个 table 都应该有一个主键,但究竟为什么?
最后,\d 命令会告诉我这个 table 是否有主键吗?如果没有,会告诉我什么?
- 不,为此使用
id serial primary key
。 - 嗯,table 实际上 "need" 不是主键。它可以在没有 PK 的情况下存在,它可以在没有自动递增字段的情况下存在,它可以包含重复的行。但是在关系理论中(SQL 建立在其之上)每个关系(即 table)是一组(在数学意义上)行。所以重复的行是不允许的,它们在集合中是不可能的。因此每个关系都有一个字段(或几个字段),它对所有关系都有唯一的值。该字段可用于唯一标识一行,其中一个可能的唯一键称为主键。 这样的键通常对于识别行非常有用,这就是为什么 tables 应该有它们。但从技术上讲,它们不是必需的。
- 是的,会的。