克隆记录,然后使用其自动增量ID进行进一步操作

时间:2017-12-26 21:01:41

标签: sql postgresql

更新

缩小代码后,似乎就行了

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(columns: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;

我是在正确的道路上实现这个吗?运行查询时,出现以下错误:

  

栏&#34; id&#34;是整数类型但表达式是字符类型   不同的提示:你需要重写或转换表达式。

它没有告诉我它出现的行号,我不知道是什么原因引起的。

2 个答案:

答案 0 :(得分:1)

INSERT INTO table1 TABLE table1_temp

您不能这样做,因为table1_temp具有不同的列集(您删除了id列)。 您需要明确指定列(除了id列之外的所有列):

INSERT INTO table1(col1, col2, ...) TABLE table1_temp

答案 1 :(得分:1)

我发现了一个简单的解决方案,用于克隆具有自动增量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 ...
...