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
的客户可能表示内部分配。
- 您可以从较高的数字开始真正的序列,并使用较低的
id
s 来实现与上述点类似的东西。
请注意,现代版本的 PostgreSQL 具有 GENERATED BY DEFAULT AS IDENTITY
形式的首选标准替代项。与现代 SQL 趋势一致,它更加冗长,但比旧的 SERIAL
.
更易于管理
我的数据库中有一个 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
的客户可能表示内部分配。 - 您可以从较高的数字开始真正的序列,并使用较低的
id
s 来实现与上述点类似的东西。
请注意,现代版本的 PostgreSQL 具有 GENERATED BY DEFAULT AS IDENTITY
形式的首选标准替代项。与现代 SQL 趋势一致,它更加冗长,但比旧的 SERIAL
.