【问题标题】:Move data from parent table (A) and its child table (B) to parent table (C) and its child table (D) - Mysql将数据从父表(A)及其子表(B)移动到父表(C)及其子表(D) - Mysql
【发布时间】:2014-12-04 14:57:49
【问题描述】:

我在编写查询或过程时遇到问题。我的要求是我想将数据从表 A 及其子表 B 移动到具有相同结构的新父表 (C) 及其子表 (D)。

将表 A 中的主键列插入表 B 中的列之一以供参考。我面临的挑战是当我从父表 A 移动到新的父表 C 时,将生成新的主键。当我将数据从子表 B 移动到新的子表 D 时,我想将新生成的键插入到表 D 中并具有相应的行。

这可能只是对某人的过程或查询。但我无法弄清楚。需要帮助!

【问题讨论】:

  • 表 A、B、C 和 D 已经创建,所有表中都有一些数据。我想将一堆行(我只有 10 个 id)从 A 移动到 C,并将其相应的行从 B 移动到 D

标签: mysql sql stored-procedures cursor


【解决方案1】:

假设你有一张桌子 A:

创建表 a ( id int(10) 无符号 NOT NULL AUTO_INCREMENT, some_data varchar(100), 主键(id) ) AUTO_INCREMENT=XXX;

还有表C:

创建表 c ( id int(10) 无符号 NOT NULL AUTO_INCREMENT, some_data varchar(100), 主键(id) ) AUTO_INCREMENT=YYY;

将您的 auto_increment 值写入表 c 并将其从您的 c.id 中删除:

ALTER TABLE c CHANGE id id int(10) unsigned NOT NULL;

创建一个临时表,例如。 tmp_copy_a_c 具有相同的 auto_increment 值: 创建临时表 tmp_copy_a_c ( id_c int(10) 无符号 NOT NULL AUTO_INCREMENT, id_a int(10) 无符号非空, some_data varchar(100), 主键(id_c), 索引 (id_a) ) AUTO_INCREMENT=YYY;

然后将A中的所有数据复制到临时表中:

INSERT INTO tmp_copy_a_c(id_a, some_data) SELECT id, some_data FROM a WHERE "table a 上的一些条件";

从 tmp_copy_a_c 复制到表 c: INSERT INTO c(id, some_data) SELECT id_c, some_data FROM tmp_copy_a_c;

将数据从表 B 复制到表 D(假设 id_d 是另一个自动增量): 插入 d(id_c, some_child_data) 选择 tmp.id_c,b.some_child_data FROM tmp_copy_a_c tmp 加入乙 ON tmp.id_a = b.id_a;

像这样在表 C 上重新创建 auto_increment:

ALTER TABLE c CHANGE id id int(10) unsigned NOT NULL AUTO_INCREMENT;

注意:此解决方案假定表在运行此脚本时没有增长/被其他进程更改。

【讨论】:

  • 对不起,如果我没有在我的问题中提到这一点。表 A、B、C 和 D 已经创建,所有表中都有一些数据。是的,您在表 A 和表 C 上都是正确的“主键上的 auto_increment 值”。我想将一堆行(我只有 10 个 id)从 A 移动到 C。并且在此表中没有创建外键关系,并且我不能改变它!
  • 好的,假设您在表 A 中有 ID 1-100,在表 C 中有 ID 1-150。现在您要将所有行从 A 复制到 C,新 ID 为 151-250 和表 D 的引用列的 ID 相同?
  • 是的,你是对的。表 A ID 1-100 的一个小改动,我不想移动 ID 为 1 - 100 的所有行。我有一些表 A 中的 ID 列表。我只想移动那些 ID。我正在研究这个,看起来我必须使用光标来编写程序来做到这一点。
  • 根据您的附加信息更改了答案。希望对您有所帮助!
  • 我面临的挑战是我无法更改表格。我必须考虑其他解决方案。不过感谢您的帮助!
猜你喜欢
  • 2019-10-11
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多