MySQL:克隆表A中的多行和表B中的相关行

时间:2015-11-11 00:06:02

标签: mysql sql

我在表A(带有AI PK)中有一组行,我想根据某些标准克隆,即:

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

但是,这些行与表B具有1-1关系,其中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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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)