复制数据,但将FK和PK移动到新数据

时间:2014-05-06 23:58:34

标签: mysql sql

我们希望设置多个“演示组织”,我们的数据库中已存在大量预先填充的数据,这样做的最佳模式/方法是什么?

注意:我们有几个需要更新的FK / PK,例如,假设“基础”组织ID为1,我们需要更新组织ID为2的所有重复数据,而不是1了。

我执行此操作的想法是创建一个tmp表,复制数据并更新数据并复制回实时表,但我不确定如何保持密钥完整性(例如,每个组织具有链接到每个组织的不同user_types,因此每个FK的引用也需要更新)

注意2:如果您的解决方案涉及外部服务/语言,则服务器可以在Linux上运行PHP / Bash脚本。

注3:有些表将有超过100万行要复制

1 个答案:

答案 0 :(得分:0)

我确实找到了解决方案,但我并不是特别满意。

理论值:

  

理论就像我在问题中描述的那样,复制原文   组织到一个临时表,更新它,然后复制回来   改性。如何解决FK / PK一致性问题?得到最后一次使用   要复制的每个表的ID,并将其存储为用户   变量名为table_name_os,请确保为其添加+1。然后我们   将所有更新的ID更新为当前值+ table_name_os。

实现:

# Allow unsafe UPDATE/DELETE operations - required on some hosts
SET SQL_SAFE_UPDATES=0;

# User Config
SET @sub_domain='demo.hippos';
SET @org_name='Hungry_Hippos';

# AUTO CONFIG 
SET @org_id=(SELECT MAX(id) FROM organisation)+1;
SET @team_id_os=(SELECT MAX(id) FROM team)+1;

### - For each table you want to write, copy this boiler plate - ###
# Organisation 
# Create Temp Table And Move Data To It 
DROP TABLE IF EXISTS temp_organisation;
CREATE TEMPORARY TABLE temp_organisation SELECT * FROM organisation WHERE id=1;
UPDATE temp_organisation SET id=@org_id,name=@org_name,subdomain=@sub_domain; 
# Move Content Back Into Main
INSERT INTO organisation SELECT * FROM temp_organisation;
DROP TABLE temp_organisation;

# Teams 
# Create Temp Table And Move Data To It 
DROP TABLE IF EXISTS temp_team;
CREATE TEMPORARY TABLE temp_team  SELECT * FROM team WHERE organisation_id=1;
UPDATE temp_team SET id=id+@team_id_os,organisation_id=@org_id,team_leader_id=null,manager_id=null; 
# Move Content Back Into Main
INSERT INTO team SELECT * FROM temp_team;
DROP TABLE temp_team;

常见问题:

问:这是最好的解决方案吗? 答:可能不是

问:这可以存储在程序中吗? 答:可能,但我从未真正使用过它们

问:这对你有用吗? 答:是的。