Postgres 要求显式提供主键,尽管类型是串行的

Val*_*itz 0 postgresql

我在 postgres 中有一个表定义如下:

\n\n
CREATE TABLE t_sample (\n    sample_pk SERIAL PRIMARY KEY, \n    lis_pkref bigint NOT NULL,\n    patient_pkref bigint NOT NULL,  \n    sample_lis_id  varchar(50) NOT NULL\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我尝试执行插入查询:

\n\n
INSERT INTO t_sample VALUES(0, 0, 'S123' )\n
Run Code Online (Sandbox Code Playgroud)\n\n

它失败并出现错误:

\n\n
LINE 5: INSERT INTO t_sample VALUES(0, 0, 'S123' )\n                                          ^\n********** Error **********\n\nERROR: not valid syntax for integer: \xe2\x80\x9eS123\xe2\x80\x9c (I've translated it)\nSQL Status:22P02\n
Run Code Online (Sandbox Code Playgroud)\n\n

此查询有效:

\n\n
INSERT INTO t_sample VALUES(0, 0, 0, 'S123' )\n
Run Code Online (Sandbox Code Playgroud)\n\n

不会serial像MySQL中的auto_increment那样自动为列创建值吗?我怎样才能实现这个目标?

\n

小智 5

您没有在语句中指定要为其提供值的列,INSERT这从一开始就是糟糕的编码风格。

只需列出您需要的列,序列号就可以正常工作:

insert into t_sample (lis_pkref, patient_pkref, sample_lis_id)
values (0, 0, 'S123' );
Run Code Online (Sandbox Code Playgroud)

另一种选择是提供以下default条款:

insert into t_sample (sample_pk, lis_pkref, patient_pkref, sample_lis_id)
values (default, 0, 0, 'S123' );
Run Code Online (Sandbox Code Playgroud)

或 - 不提及列

insert into t_sample
values (default, 0, 0, 'S123' );
Run Code Online (Sandbox Code Playgroud)

但是:从长远来看,不指定语句中的列INSERT会给您带来麻烦。您应该始终明确列出它们!

不要指定0序列列的值。与 MySQL 不同,Postgres 尝试准确地存储您提供的值 - MySQL 会默默地将例如 的值转换0为自动增量值。


出现错误消息的原因是INSERT INTO t_sample VALUES(0, 0, 'S123' )Postgres(或实际上任何DBMS)语句期望表的前三列有值。在示例表中,前三列是整数,因此'S123'无法插入,因为它不是整数。