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

Vic*_*tor 5 database postgresql primary-key postgresql-9.3

我的数据库中有一张表,其ID为0(零)的行。主键是一个串行列。

我习惯于看到以1开头的序列。因此,如果我将此ID保持为零,是否存在问题?

cjd*_*jds 8

串行数据类型创建自动递增的整数列。因此,您应该能够向该列添加任何整数值(包括0)。

来自文档

类型名称serial和serial4是等效的:都创建整数列。

....(有关串行的更多信息),我们创建了一个整数列,并安排其默认值从序列生成器中分配

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


Man*_*ngo 5

这是作为答案提出的,因为它\xe2\x80\x99s 对于评论来说太长了。

\n

你\xe2\x80\x99实际上在这里谈论两件事。

\n

是指定为表的唯一标识符的列。可能还有其他唯一的列,但主键是您选定的列,可能是因为它\xe2\x80\x99 是最稳定的值。(例如,客户\xe2\x80\x99s 的电子邮件地址是唯一的,但它\xe2\x80\x99s 可能会发生变化,并且\xe2\x80\x99s 更难管理)。

\n

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

\n

在(大多数?)其他情况下,主键是没有内在含义的任意值。在这种情况下,它称为代理键。

\n

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

\n

对于 PostgreSQL,通常与序列号关联的数据类型是integer,并且这在类型中隐含SERIAL。如果您在 MySQL/MariaDB 中执行此操作,则可以使用unsigned integer,它没有\xe2\x80\x99t 负值。PostgreSQL 没有\xe2\x80\x99t unsigned,所以数据确实可能是负数。

\n

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

\n

实际给出答案:

\n
    \n
  • 可以具有您喜欢的任何兼容值,只要它\xe2\x80\x99 是唯一的。
  • \n
  • 序列也可以具有任何兼容的值,但标准做法是以 开头1,因为 \xe2\x80\x99 是我们人类计数的方式。
  • \n
\n

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

\n
    \n
  • 如果尚未选择有效行\xe2\x80\x99,我有时会使用0默认值。
  • \n
  • 您可以使用负数id来表示非标准数据,例如用于测试或虚拟值;例如,给出否定的客户id可能表示内部分配。
  • \n
  • 您可以从较大的数字开始真正的序列,并使用较小的ids 来实现与上述类似的操作。
  • \n
\n

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

\n