【问题标题】:MySQL: How to migrate tables while preserving relationship?MySQL:如何在保留关系的同时迁移表?
【发布时间】:2021-05-01 00:29:15
【问题描述】:

我有几个用外键相互关联的表。每个表都有一个自动增量的主键。每个表中有几千行。

这是我的桌子:

CREATE TABLE table1 (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    val INT
);
CREATE TABLE table2 (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    val INT, 
    table1_id INT REFERENCES table1 (id)
);
INSERT INTO table1 VALUES (1,1), (2,2), (3,3);
INSERT INTO table2 VALUES (1,1,1), (2,2,2), (3,3,3);

我需要将所有数据添加到已经存在表的另一个数据库(具有相同的定义)并在其中包含一些数据。必须保留现有数据。

如何在保留这些表之间的关系的同时导出和重新导入这些表?

我的想法是编写一个程序将表导出为 JSON,另一个程序通过插入行并调整外键来重新导入(我主要使用 PHP)。还是我应该使用 Microsoft Excel?但我想还有更简单的方法。

【问题讨论】:

  • 应该改变键吗?然后你需要编写一些应用程序来处理这个问题,因为我认为没有工具可以自动为你解析依赖的实体
  • 键可以改变,但必须保留行的关系。
  • @Akina 是的。我更新了我的问题。
  • 要导入的数据是否会导致唯一性或其他一些约束违规(PK除外)?如果两个数据库包含相同的行 - 这些行是否可以合并为一行?
  • @Akina 需要添加导入的数据。

标签: mysql database-migration


【解决方案1】:

一个例子。

-- working tables with data
CREATE TABLE main_w (id_m INT AUTO_INCREMENT PRIMARY KEY, 
                     val INT);
CREATE TABLE slave_w (id_s INT AUTO_INCREMENT PRIMARY KEY, 
                      val INT, 
                      id_m INT REFERENCES main_w (id_m));
INSERT INTO main_w VALUES (1,1), (2,2), (3,3);
INSERT INTO slave_w VALUES (1,1,1), (2,2,2), (3,3,3);
-- temporary tables with data to be added
CREATE TABLE main_s (id_m INT, 
                     val INT);
CREATE TABLE slave_s (id_s INT, 
                      val INT, 
                      id_m INT);
INSERT INTO main_s VALUES (1,11), (2,22), (3,33);
INSERT INTO slave_s VALUES (1,11,1), (2,22,2), (3,33,3);
-- add data from temporary main to working main
INSERT INTO main_w
SELECT NULL, val 
FROM main_s;
-- add data from temporary slave to working slave adjusting references
INSERT INTO slave_w
SELECT NULL, slave_s.val, main_w.id_m
FROM slave_s
JOIN main_s ON slave_s.id_m = main_s.id_m
JOIN main_w ON main_s.val = main_w.val;

db小提琴here

【讨论】:

  • 好的,原理我明白了,但看起来不是一个容易上手的解决方案。在我深入这里之前,我必须在哪里执行这些语句?在进口方面?
  • @WeSee 我必须在哪里执行这些语句?在导入方面? 是的,在数据​​加载(LOAD DATA INFILE)到临时表之后。
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多