【问题标题】:Is a 'serial' column automatically a primary key in PostgreSQL?'serial' 列是否自动成为 PostgreSQL 中的主键?
【发布时间】:2016-05-21 22:13:10
【问题描述】:

我在 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 命令会告诉我这个表是否有主键吗?如果没有,会告诉我什么?

【问题讨论】:

    标签: postgresql primary-key psql


    【解决方案1】:
    1. 不,请使用id serial primary key
    2. 嗯,表实际上并不“需要”主键。它可以在没有 PK 的情况下存在,它可以在没有自动增量字段的情况下存在,它可以包含重复的行。但是在关系理论中(在其之上构建了 SQL),每个关系(即表)都是一组(在数学意义上)行。因此,不允许重复行,它们根本不可能成组出现。因此,每个关系都有一个字段(或多个字段),该字段对所有关系都有唯一的值。此类字段可用于唯一标识一行,其中一个可能的唯一键称为主键。 这样的键通常对于识别行非常有用,这就是为什么表应该有它们的原因。但从技术上讲,它们不是必需的。
    3. 是的,会的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2021-08-12
      • 2014-01-02
      • 2013-08-25
      • 2013-11-05
      相关资源
      最近更新 更多