“串行”列是否自动成为PostgreSQL中的主键?

时间:2016-05-21 22:13:11

标签: postgresql primary-key psql

我在Postgres中创建了下表...

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

它似乎正是我需要它...它自动递增id列,当我使用truncate“RESTART IDENTITY”清除表时它会重置序列(这就是我在第一次重建表的原因) place - 用于在截断时不重新启动的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 个答案:

答案 0 :(得分:5)

  1. 不,请使用id serial primary key
  2. 好吧,表实际上并不“需要”主键。它可以在没有PK的情况下生存,它可以在没有自动增量字段的情况下生存,它可以包含重复的行。但是在关系理论(在其上构建SQL)之上,每个关系(即表)是行(在数学意义上)的行集。因此不允许重复行,它们在集合中是不可能的。因此,每个关系都有一个字段(或几个字段),它具有所有关系的唯一值。这样的字段可以用于唯一地标识行,并且可能的唯一密钥之一被称为主键。 这样的键通常对于识别行非常有用,这就是表应该有它们的原因。但从技术上讲,它们不是必需的。
  3. 是的,它会。