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

时间:2015-04-20 13:05:18

标签: postgresql

我在postgres中有一个像这样定义的表:

CREATE TABLE t_sample (
    sample_pk SERIAL PRIMARY KEY, 
    lis_pkref bigint NOT NULL,
    patient_pkref bigint NOT NULL,  
    sample_lis_id  varchar(50) NOT NULL
);

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

INSERT INTO t_sample VALUES(0, 0, 'S123' )

失败并出现错误:

LINE 5: INSERT INTO t_sample VALUES(0, 0, 'S123' )
                                          ^
********** Error **********

ERROR: not valid syntax for integer: „S123“ (I've translated it)
SQL Status:22P02

此查询有效:

INSERT INTO t_sample VALUES(0, 0, 0, 'S123' )

serial不会像MySQL中的auto_increment那样自动创建列的值吗?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

您没有在INSERT语句中指定要为其提供值的列,这些列的编码风格很差。

只列出您需要的列,串口才能正常工作:

insert into t_sample (lis_pkref, patient_pkref, sample_lis_id)
values (0, 0, 'S123' );

另一种方法是提供default子句:

insert into t_sample (sample_pk, lis_pkref, patient_pkref, sample_lis_id)
values (default, 0, 0, 'S123' );

或 - 未提及列

insert into t_sample
values (default, 0, 0, 'S123' );

但是:从长远来看,不指定INSERT语句中的列会让你遇到麻烦。你应该总是明确列出它们!

为串行列指定值0。与MySQL不同,Postgres尝试完全按照您提供的值存储值--MySQL静默转换为值0为自动增量值。


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

答案 1 :(得分:1)

确实如此,但你必须告诉PostgreSQL你提供哪些值。

INSERT INTO t_sample (lis_pkref, patient_pkref, sample_lis_id) VALUES (0, 0, 'S123' )

如果你不这样做,它自然会从第一个开始。在任何情况下都不会跳过任何列。