【问题标题】:MySQL copy hierarchical data and maintain relationshipMySQL复制分层数据并维护关系
【发布时间】:2012-01-11 04:17:50
【问题描述】:

我需要在具有层次关系的选项卡中复制数据并在新数据中维护关系。

我有一个表“site_content”,表有数千行,表中的数据相当大。以下是简化的表结构和列数据示例。

  CREATE TABLE `site_content` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `site_id` int(11) DEFAULT NULL,
 `parent` int(11) unsigned DEFAULT NULL,
 `parent_orig_id` int(11) unsigned DEFAULT NULL,
 `content_text` text,
PRIMARY KEY (`id`));

INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(1, 76, 0, NULL, '');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(2, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(3, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(4, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(5, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(6, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(7, 76, 2, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(8, 76, 3, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(9, 76, 3, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(11, 76, 9, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(12, 76, 9, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(13, 76, 9, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(14, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(15, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(28, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(29, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(30, 76, 5, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(32, 76, 5, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(36, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(41, 76, 32, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(42, 76, 32, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(43, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(44, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(45, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(46, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(47, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(48, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(49, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(50, 76, 42, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`) VALUES(51, 76, 42, NULL, 'some content');

我需要复制表中的“站点 76”行,因此我使用此查询来复制表,并在 'parent_orig_id' 列中给我原始父子关系信息。

INSERT INTO site_content (`id`, `site_id`, `parent`, `parent_orig_id`, `content_text`)
SELECT NULL, "200", `parent`, `id`, `content_text` FROM site_content 
WHERE `site_id` = '76';

我现在将站点“76”的数据复制到表中作为站点“200”

如何更新新站点 200 行以与站点 76 行具有相同的关系?例如,行“1”是行“2、3、4、5、6”的父行。

站点 200 的行“2”现在是行 ID“53”,并且根据副本中的“父”列认为其父行仍然是行“1”。如何更新复制行中的“父”列以反映新关系,因为它是站点 200。“parent_orig_id”列包含原始层次关系的行 ID。

我可以看到,如果我执行查询,我需要更新什么。如果可能,我想在 SQL 中执行此操作。

select a.id current_row, a.parent as current_parent, b.id AS new_parent
  from site_content a, site_content b
 where b.parent_orig_id = a.parent AND a.site_id = '200' AND b.site_id = '200'

【问题讨论】:

  • 您能解释一下为什么站点 200 的行“2”现在是行 ID“53”吗?为什么和旧表不一样?
  • 啊,我没有意识到你正在复制到同一个表中。我想我现在可以帮你。
  • 第2行是复制数据的第二行
  • 罗杰。我的困惑消除了。谢谢。

标签: mysql sql-update


【解决方案1】:

您不仅需要维护parent_orig_id,还需要维护orig_id。由于您为此使用在表格中设置列的策略已经走了一半的距离,我将继续朝这个方向发展。像这样:

CREATE TABLE `site_content` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`site_id` int(11) DEFAULT NULL,
`parent` int(11) unsigned DEFAULT NULL,
`orig_id` int(11) unsigned DEFAULT NULL,
`parent_orig_id` int(11) unsigned DEFAULT NULL,
`content_text` text,
PRIMARY KEY (`id`));

INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(1, 76, 0, NULL, '');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(2, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(3, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(4, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(5, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(6, 76, 1, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(7, 76, 2, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(8, 76, 3, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(9, 76, 3, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(11, 76, 9, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(12, 76, 9, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(13, 76, 9, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(14, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(15, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(28, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(29, 76, 4, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(30, 76, 5, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(32, 76, 5, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(36, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(41, 76, 32, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(42, 76, 32, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(43, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(44, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(45, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(46, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(47, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(48, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(49, 76, 41, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(50, 76, 42, NULL, 'some content');
INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`) VALUES(51, 76, 42, NULL, 'some content');


INSERT INTO `site_content` (`id`, `site_id`, `parent`, `orig_id`,  `parent_orig_id`, `content_text`)
SELECT NULL, "200", NULL, `orig_id`, `parent_orig_id`, `content_text` FROM site_content 
WHERE `site_id` = '76';

UPDATE site_content AS sc_target 
LEFT JOIN site_content AS sc_source 
ON sc_source.parent_orig_id = sc_target.parent 
SET sc_target.parent = sc_source.id where sc_target.site_id = "200"

【讨论】:

  • 对不起,我的大脑目前正在融化。数据已经存在于数据库中,我正在复制一部分数据。我正在复制同一个表中的行以用于另一个 ID 为 200 的“站点”。此表用于根据站点 ID 显示数据。
  • 罗杰。我现在正在读你。如果你和我在一起,我想我们很快就会解决这个问题。如果有任何问题,请回复我的答案。
  • 请不要在 SO 帖子上使用问候和签名。塔
  • @TomHaws - 你让我走上了正轨,我想你误解了我在找什么。这是对我有用的解决方案。
  • UPDATE site_content AS sc_target LEFT JOIN site_content AS sc_source ON sc_source.parent_orig_id = sc_target.parent SET sc_target.parent = sc_source.id330 哪里 sc_target.@986 @ = "200"
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2015-04-17
  • 2014-02-19
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多