缩小代码范围后,似乎该行
INSERT INTO table1 TABLE table1_temp RETURNING id
造成了问题。任何提示这有什么问题吗?
table1有许多列(我不在乎),并且它具有自动递增主键(id)。这是我需要做的以及正在尝试的方式:
首先,我想复制table1中的一条记录。
BEGIN; CREATE TEMP TABLE table1_temp ON COMMIT DROP AS SELECT * FROM table1 WHERE id = <some integer>; ALTER TABLE table1_temp DROP COLUMN id; WITH generated_id AS ( INSERT INTO table1 TABLE table1_temp RETURNING id )
然后,对some_table执行插入操作,在这里我需要使用在table1中创建的副本的生成ID。
INSERT INTO some_table (something, the_id_into_this) VALUES ('some value', (SELECT id FROM generated_id));
然后从yet_another_table中获取一些数据(列:somestuff,id_here),并使用此数据和ID插入同一张表中。
INSERT INTO yet_another_table (SELECT somestuff, (SELECT id FROM generated_id) AS id_here FROM yet_another_table WHERE id_here = <some integer>)
最后,我需要返回ID,以便可以在我的应用中使用它…
RETURNING id_here AS id; COMMIT;
我是否在正确的道路上实现这一目标?运行查询时,出现以下错误:
列“ id”的类型为整数,但表达式的类型为字符变化提示:您将需要重写或强制转换表达式。
它没有告诉我行号在哪里出现,我也不知道是什么原因引起的。
我找到了一个简单的解决方案,用于克隆具有自动增量ID的记录,该方法不需要您指定表的任何其他列:
BEGIN; CREATE TEMP TABLE table1_temp ON COMMIT DROP AS SELECT * FROM table1 WHERE id = #; UPDATE table1_temp SET id = nextval('table1_seq'); INSERT INTO table1 TABLE table1_temp; COMMIT;
对于问题的CTE部分,这是如何通过串联WITH语句在多个后续查询中重用返回的值:
WITH generated_id AS ( INSERT INTO ... RETURNING id ), _ AS ( QUERY1 ... SELECT id FROM generated_id ... ), __ AS ( QUERY2 ... SELECT id FROM generated_id ... ...