我需要复制同一张表中的记录,只更改一个字段。我的表具有默认生成的序列entry_id_seq
,但是我不确定id
列是否为 SERIAL(如何检查?)。
\d tab
只返回这个
Column | Type | Modifiers
-----------------+--------------------------------+------------------------
id | integer | not null
...
Indexes:
"tab_entry_pkey" PRIMARY KEY, btree (id)
所以问题是:当我尝试以简化的方式复制记录时:
insert into tab_entry select * from tab_entry where id = 3052;
它抛出错误
ERROR: duplicate key value violates unique constraint "tab_entry_pkey"
DETAIL: Key (id)=(3052) already exists.
默认情况下,默认序列不会生成下一个值。是否有任何简洁的语法允许在没有完整表规范的情况下插入和更改单个字段FROM tab(col1, col2, col3, ..., col N)
?
该表有很多字段,所以我不想全部写出来,因为这会影响代码的可读性。我想要这样的东西,但是这种语法不起作用
insert into tab_entry(id, *) select nextval('seq'), * from tab_entry where id = 3052;
SELECT nextval('seq')
如果一次有多个记录,这种方法会起作用吗?
Psql 和 Postgres 版本是 9.6.2。