在PostgreSQL中,“serial”列是否自动成为主键?

11

我已经在Postgres中创建了以下表:

create table printq (
   model varchar(20),
   session integer,
   timestamp timestamp DEFAULT now(),
   id serial);

它似乎完全符合我的需求……它自动递增id列,当我使用截断“RESTART IDENTITY”清除表时,它会重置序列(这就是我首先重建表的原因——id列过去不会在截断后重新启动)

无论如何,在对表执行\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列是自动增量的,它是否已经是主键了?

  • 如果不是,既然它看起来很好用,为什么这张表需要一个主键呢?我知道基本上每张表都应该有一个主键,但为什么?

  • 最后,\ d命令会告诉我这个表是否有主键吗?如果不是,什么会告诉我?

1个回答

14
  1. 不,使用 id serial primary key 来实现。
  2. 嗯,一张表并不需要“必须”有主键。没有主键它仍然可以存在,没有自增字段也可以,甚至可以包含重复的行。但是在关系理论(SQL 建立在其之上)中,每个关系(即表)都是一组(数学意义上的)行。因此,重复的行是不允许的,在集合中根本不存在这种情况。因此,每个关系都应该具有一个字段(或多个字段),该字段在整个关系中具有唯一值。这样的字段可用于唯一标识一行,其中一个可能的唯一键称为主键。 这样的键通常非常有用,用于标识行,这就是为什么表应该具有它们的原因。但从技术上讲,它们并非必需。
  3. 是的,会的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接