postgresql - 'serial' 列是否自动成为 PostgreSQL 中的主键?

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

关于postgresql - 'serial' 列是否自动成为 PostgreSQL 中的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368513/

相关文章:

python - Django:重复键值违反唯一约束

postgresql - postgresql中从一列中分割数据并插入到另一个表中

sql - "ON"处或附近的 postgres 语法错误

java - 如何在 Java Servlet 中从多个表 (PostgreSQL) 检索数据?

mysql - 为什么我们应该将外键定义为数据透视表中的主键?

python - SqlAlchemy 表继承和主键

sql - 如何在 Amazon Redshift 中更改 TABLE 以将两列设置为主键?

postgresql - 没有 -h 标志,psql 无法连接

postgresql - psql,无法将数据库内容复制到另一个 - 无法在事务 block 内运行 -

postgresql - 我可以只列出表和/或 View ,而不列出索引吗?