我在 postgres 中有一个表定义如下:
\n\nCREATE 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);\nRun Code Online (Sandbox Code Playgroud)\n\n如果我尝试执行插入查询:
\n\nINSERT INTO t_sample VALUES(0, 0, 'S123' )\nRun Code Online (Sandbox Code Playgroud)\n\n它失败并出现错误:
\n\nLINE 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\nRun Code Online (Sandbox Code Playgroud)\n\n此查询有效:
\n\nINSERT INTO t_sample VALUES(0, 0, 0, 'S123' )\nRun Code Online (Sandbox Code Playgroud)\n\n不会serial像MySQL中的auto_increment那样自动为列创建值吗?我怎样才能实现这个目标?
小智 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'无法插入,因为它不是整数。
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |