繁体   English   中英

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

[英]Is a 'serial' column automatically a primary key in PostgreSQL?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM