MySQL复制分层数据并保持关系

时间:2012-01-09 23:00:47

标签: mysql sql-update

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

我有一个表“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');

我需要复制表中的“site 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”。如何更新复制行中的“parent”列现在反映新关系,因为它是站点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'

1 个答案:

答案 0 :(得分:0)

您不仅需要维护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"
相关问题