我在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那样自动创建列的值吗?我怎样才能做到这一点?
答案 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' )
如果你不这样做,它自然会从第一个开始。在任何情况下都不会跳过任何列。