当前位置: 首页 > 面试题库 >

插入``从选择''返回ID映射

马琛
2023-03-14
问题内容

我正在使用PostgreSQL 9.3。

我想复制一些数据库记录。由于我正在为表使用自动递增的pk
ID,因此我想将ID映射从生成的重复记录ID找回原始记录。例如,假设我有一个posts包含2条记录的表:

 [{'id': 1, 'title': 'first'}
, {'id': 2. 'title': 'second'}]

使用SQL:

INSERT INTO posts (title) SELECT title FROM posts RETURNING id, ??

我希望看到类似的映射:

 [{'id': 3, 'from_id': 1}
, {'id': 4, 'from_id': 2}]

关于如何填写上面的问号以使其起作用的任何想法吗?非常感谢!


问题答案:

这对于来说会更简单UPDATE,在此RETURNING子句中可以看到加入到更新中的其他行:

  • 仅使用SQL返回UPDATE之前的列值-PostgreSQL版本

目前 无法
使用INSERT。每个文档:

表达式可以使用由 table_name 命名的表的任何列名称 __

table_nameINSERT命令的目标。

您可以使用(数据修改)CTE使其正常工作。
假设title每次查询的唯一 ,否则你需要做的更多:

WITH sel AS (
   SELECT id, title
   FROM   posts
   WHERE  id IN (1,2)   -- select rows to copy
   )
,    ins AS (
   INSERT INTO posts (title)
   SELECT title FROM sel
   RETURNING id, title
 )
SELECT ins.id, sel.id AS from_id
FROM   ins
JOIN   sel USING (title);

如果title不是每个查询唯一(但至少id每个表唯一):

WITH sel AS (
   SELECT id, title, row_number() OVER (ORDER BY id) AS rn
   FROM   posts
   WHERE  id IN (1,2)   -- select rows to copy
   ORDER  BY id
   )
,    ins AS (
   INSERT INTO posts (title)
   SELECT title FROM sel ORDER  BY id  -- ORDER redundant to be sure
   RETURNING id
 )
SELECT i.id, s.id AS from_id
FROM  (SELECT id, row_number() OVER (ORDER BY id) AS rn FROM ins) i
JOIN   sel s USING (rn);

第二个查询依赖于未记录的实现细节,即按提供的顺序插入行。它可以在所有当前的Postgres版本中使用,并且可能不会中断。

SQL提琴。



 类似资料:
  • 问题内容: 我正在插入一条记录,我想使用插入的最后一条记录的ID。这是我尝试过的: 我收到错误消息: SQL语法错误;请查看与您的MySQL服务器版本相对应的手册,以在“ SELECT LAST_INSERT_ID()”附近使用正确的语法。谁能告诉我我的错误在哪里?谢谢! 问题答案: 签出mysql_insert_id() 在mysql_query()命令中执行INSERT语句后运行该函数时,其结

  • 首先对不起我的英语。我的isset有问题这是代码: PHP: 问题是,使用Post值在表1上搜索时可以,但在id为表1的表2上插入和在表2上添加时,id列上的值仅为0 Html: 这是html代码,我在一个氏族表中选择氏族的详细信息,当成员选择氏族名称并插入按钮时,发送的代码中选择了一个氏族名称,如isset值中的test CLANE,并在isset值中选择选项值CLANE name on tab

  • 本文向大家介绍Mybatis返回插入主键id的方法,包括了Mybatis返回插入主键id的方法的使用技巧和注意事项,需要的朋友参考一下 在mapper的xml文件中配置  useGeneratedKeys 以及 keyProperty 返回Id即可 PS:Mybatis中insert中返回主键ID的方法 1、XyzMapper.xml 或 2、XyzMapper.java 3、要在map或c中有一

  • 我试图使用console.log(结果),但似乎得到了一组方法,但我不知道如何获得所需的信息。

  • 我有一个带有< code>ID主键(自动增量)和唯一列< code>Name的表。如果相同的< code>Name不存在,在MariaDB中有没有一种有效的方法将一行插入到这个表中,否则选择现有的行,并且在这两种情况下,返回具有这个< code>Name的行的ID? 这是Postgres的解决方案。然而,MariaDB似乎没有子句。到目前为止,我尝试的是暴力: 更新:MariaDB 10.5有子句

  • 问题内容: 我正在使用Informix(版本7.32)数据库。在一项操作中,我创建了一个临时表,其中包含常规表的ID和一个串行列(因此,我将从常规表中获得的所有ID进行连续编号)。但是我想从ID排序的常规表中插入信息,例如: 但这会产生语法错误(由于ORDER BY) 有什么方法可以订购信息,然后将其插入到tempTable中? 更新:我要这样做的原因是因为常规表中有大约10,000个项目,并且在