postgres 中的主键可以有零值吗?

Can a primary key in postgres have zero value?

我的数据库中有一个 table 有一行 ID 等于 0(零)。 主键是串行列。

我习惯看到以1开头的序列,那么,如果我将这个ID保持为零,会有问题吗?

Serial 数据类型创建了碰巧自动递增的整数列。因此,您应该能够将任何整数值添加到该列(包括 0)。

来自文档

The type names serial and serial4 are equivalent: both create integer columns.

....(more about Serial) we have created an integer column and arranged for its default values to be assigned from a sequence generator

http://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

这是一个答案,因为它对于评论来说太长了。

你实际上在谈论两件事。

A 主键 是指定为 table 的唯一标识符的列。可能还有其他唯一列,但主键是您确定的那个,可能是因为它是最 stable 值。 (例如,客户的电子邮件地址是唯一的,但它可能会发生变化,并且更难管理)。

主键可以是任何常见的数据类型,只要保证唯一即可。在某些情况下,主键是行数据的自然属性,在这种情况下它是自然主键。

在(大多数?)其他情况下,主键是一个没有内在含义的任意值。在那种情况下,它被称为 surrogate 键。

最简单的代理键,我喜欢称之为惰性代理键,是一个序列号。从技术上讲,它不是真正的代理项,因为序列中存在固有含义,但它是任意的。

对于 PostgreSQL,通常与序列号关联的数据类型是 integer,这隐含在 SERIAL 类型中。如果你在 MySQL/MariaDB 中这样做,你可能会使用 unsigned integer,它没有负值。 PostgreSQL没有unsigned,所以数据确实可以是负数

关于序列号的要点是它们通常从 1 开始并递增 1。在 PostgreSQL 中,您可以手动设置自己的序列(SERIAL 只是一个快捷方式),在这种情况下,您可以从任何您喜欢的值开始,例如 100 , 0 甚至 -100 等等

实际给出答案:

  • 一个主键可以有任何你喜欢的兼容值,只要它是唯一的。
  • 一个序列号也可以有任何兼容的值,但标准做法是从1开始,因为我们人类就是这样计算的。

推翻从一开始原则的原因包括:

  • 如果未选择有效行,我有时会使用 0 作为一种默认设置。
  • 您可以使用负数 id 来表示非标准数据,例如用于测试或虚拟值;例如,具有负 id 的客户可能表示内部分配。
  • 您可以从较高的数字开始真正的序列,并使用较低的 ids 来实现与上述点类似的东西。

请注意,现代版本的 PostgreSQL 具有 GENERATED BY DEFAULT AS IDENTITY 形式的首选标准替代项。与现代 SQL 趋势一致,它更加冗长,但比旧的 SERIAL.

更易于管理