PostgreSQL插入时如何将id列值复制到copyofid列?
问题解答
可以在单条INSERT语句中实现将生成的id值复制到copyofid列,但你之前的写法有误——因为VALUES子句里无法引用当前插入行还未生成的id值。
下面提供两种可行的单条语句实现方式:
方法一:利用序列函数+WITH子句
PostgreSQL中SERIAL类型会自动创建对应的序列(命名规则为表名_id_seq),我们可以先获取序列的下一个值,再将其同时赋值给id和copyofid:
WITH new_id AS ( SELECT nextval('mytable_id_seq') AS id ) INSERT INTO mytable(id, content, copyofid) SELECT id, 'test', id FROM new_id;
方法二:使用DEFAULT结合INSERT...SELECT
如果不想手动指定序列名,也可以用DEFAULT让PostgreSQL自动生成id,同时通过currval获取刚生成的序列值(注意currval只能在当前会话已经调用过nextval的前提下使用,这里INSERT操作会自动触发nextval调用):
INSERT INTO mytable(content, copyofid) SELECT 'test', currval('mytable_id_seq') FROM (SELECT DEFAULT AS dummy) AS t;
你之前的语句INSERT INTO mytable(content, copyofid) VALUES("test", id);无法工作的原因是:VALUES子句中的id被解析为未定义的变量或不存在的列,此时当前插入行的id还未生成,数据库无法识别这个引用。
内容的提问来源于stack exchange,提问作者Robert C. Holland
相关产品推荐
相关产品推荐

