【问题标题】:MySQL: Clone multiple rows in Table A and related rows in Table BMySQL:克隆表 A 中的多行和表 B 中的相关行
【发布时间】:2015-11-11 15:08:07
【问题描述】:

我在表 A 中有一组行(使用 AI PK),我想根据某些条件克隆它们,即:

INSERT INTO A (field1, field2, field3) SELECT field1,field2,field3 FROM A WHERE (criteria)

但是,这些行与表 B 具有 1-1 关系,表 B 在 B 中具有 AI PK,在 A 中具有 FK。我还想克隆表 B 中的相关行并将 A 中的克隆行指向B 中的克隆行不是原始行。

我正在寻找最简单的方法来做到这一点——最好是在 SQL 中。

这是我正在尝试做的一个示例:

克隆前:

Table A 
ID   B_FK   Other Data  Meets Clone Criteria    
1    101    Data 1      true
2    102    Data 2      false 
3    103    Data 3      true
4    104    Data 4      true

Table B
ID   Other Data
101  Data A
102  Data B
103  Data C
104  Data D

行克隆后:

Table A 
ID   B_FK   Other Data
1    101    Data 1
2    102    Data 2 
3    103    Data 3
4    104    Data 4
5    105    Data 1
6    106    Data 3
7    107    Data 4

Table B
ID   Other Data
101  Data A
102  Data B
103  Data C
104  Data D
105  Data A
106  Data C
107  Data D

【问题讨论】:

标签: mysql sql


【解决方案1】:

这是一种使用子查询复制表 b 中的行并让它们指向表 a 中的新 fk 的方法

insert into b (a_fk, some_field)
select 
    (select max(a2.id) from a a2
    where a2.id <> a1.id
    and a2.field1 = a1.field1
    and a2.field2 = a1.field2
    and a2.field3 = a1.field3), 
    b.some_field
from b
join a a1 on a1.id = b.a_fk
where (criteria)

但创建一个包含源 ID 的附加列可能更容易(也更快)

insert into a (field1, field2, field3, source_id) 
select field1, field2, field3, id 
from a where (criteria)

insert into b (a_fk, some_field)
select a.id, b.some_field 
from b
join a on a.source_id = b.a_fk
where (criteria)

【讨论】:

  • 表格中的列太多,第一种方法不太吸引人(我还想要一个更可重用的解决方案)。按照您的建议添加一列确实可能是一个很好的解决方案。我认为这也可以用 MySQL 游标来完成?我现在正在尝试探索这种方法。
  • 我使用了额外的列方法
【解决方案2】:

SET FOREIGN_KEY_CHECKS=0 然后用 INSERT INTO ... SELECT 做任何你需要做的事情 如果之后还有更多工作需要外键检查 SET FOREIGN_KEY_CHECKS=1

【讨论】:

  • 问题是我需要表 A 中的克隆行为表 B 中新克隆的行提供正确的外键。
  • 您能举个例子说明一下吗?特别是,为什么只将行从 A 插入 B 是行不通的。
  • 是的,我已经编辑了上面的问题。我不想将行从 A 克隆到 B。我正在尝试将 A 中的行克隆到 A,同时还将 B 中的相关子行克隆到 B。
猜你喜欢
  • 2022-10-14
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多