SQL 迁移脚本 - 插入到带有输出 ID 的选择中

Posted

技术标签:

【中文标题】SQL 迁移脚本 - 插入到带有输出 ID 的选择中【英文标题】:SQL migration script - insert into select with output ID 【发布时间】:2021-11-15 19:36:09 【问题描述】:

我正在使用PostgreSQLFlyway 在应用程序中执行数据迁移。这个想法是将行从一个表移动到另一个表,并在旧表中保持旧表和新表之间的链接。因此,假设我们有一个包含列(id、name、user_id)的 Table_1 和一个包含类似列(id2、name2、user_id2)的新 Table_2

现在,第一步是向 Table_1 添加一列,将其对应的 id 存储在新的 Table_2 中。所以:

alter Table_1 add column if not exists migrated_table_2_id int;

现在我想写一个sql,将数据从Table_1迁移到Table_2,同时填写migrated_table_2_id列中的id值。所以像:

insert into Table_2 (name2, user_id2) select name, user_id from Table_1;

但在migrated_table_2_id 中填写表 2 中新创建的行

【问题讨论】:

【参考方案1】:

您可以使用 CTE,假设 name2user_id2 或两者的组合是唯一的:

with i as (
      insert into Table_2 (name2, user_id2)
          select name, user_id 
          from Table_1
          returning *
     )
update table_1 t1
    set t1.user_id2 = t2.id
    from table_2 t2
    where t2.name = t1.name and t2.user_id2 = t.user_id;

【讨论】:

以上是关于SQL 迁移脚本 - 插入到带有输出 ID 的选择中的主要内容,如果未能解决你的问题,请参考以下文章

SQL插入的唯一约束-ORACLE

DB2 根据 php 脚本中的绑定参数选择和插入

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

避免插入与选择相结合的 SQL 死锁

SQL循环表将记录插入新表,然后获取新ID并插入其他表

如何在一个脚本中使用 R 将 SQL 查询中的数据插入到单独的 SQL 查询中?