2010-07-14 81 views
5

我希望在這個問題上我不會太長時間,我只是想確保我所要求的是完全清楚的(我認爲它相當混亂:)。複製關係表數據

我有一堆表的數據庫與我所有的外鍵約束設置。關係有時會有幾個表格深度,還有一些情況是一個孩子與多個父表格相關聯。我想插入我的「頂級」表格行的一個副本,以及與其相關的所有子表數據(保持關係完整性)。也就是說,我的新頂級行通過auto_increment獲得了自己的新主鍵,並且所有新的子行都獲得了自己的主鍵(同樣通過auto_increment),並且表中的所有外鍵信息類似於我複製的數據(現在只有新創建的主鍵)。所以現在我會擁有一個獨立於原始數據的關係數據副本。

爲了讓我的例子更加具體,我精心設置了一個類似的,但更簡單的例子。讓我們定義如下表:

alt text http://www.freeimagehosting.net/uploads/ef22070a89.png

所有綠色的ID字段是AUTO_UPDATE主鍵,並將微黃色的有索引與外鍵約束列。比方說,在數據庫中它具有以下數據開始:

job_types 
+----+----------+ 
| id | jobcode | 
+----+----------+ 
| 1 | DEADBEEF | 
| 3 | FEEDFACE | 
+----+----------+ 

managers 
+----+---------------+-------------+ 
| id | name   | job_type_id | 
+----+---------------+-------------+ 
| 1 | John   |   1 | 
| 3 | Michael Scott |   3 | 
+----+---------------+-------------+ 

departments 
+----+------+------------+ 
| id | name | manager_id | 
+----+------+------------+ 
| 1 | H32 |   1 | 
| 2 | X11 |   3 | 
+----+------+------------+ 

employees 
+----+-------------+---------------+------------+-------------+ 
| id | name  | department_id | manager_id | job_type_id | 
+----+-------------+---------------+------------+-------------+ 
| 1 | Billy Bob |    1 |   1 |   1 | 
| 2 | Sandra Lee |    1 |   1 |   3 | 
| 3 | Buddy Holly |    2 |   3 |   1 | 
+----+-------------+---------------+------------+-------------+ 

現在說什麼我想要做的就是讓部門的關係副本H32(ID = 1)。我最終應該得到的結果如下所示(顯然,主鍵的實際值並不重要,參照完整性也是如此)。

job_types 
+----+----------+ 
| id | jobcode | 
+----+----------+ 
| 1 | DEADBEEF | 
| 3 | FEEDFACE | 
| 4 | DEADBEEF | 
| 5 | FEEDFACE | 
+----+----------+ 

managers 
+----+---------------+-------------+ 
| id | name   | job_type_id | 
+----+---------------+-------------+ 
| 1 | John   |   1 | 
| 3 | Michael Scott |   3 | 
| 4 | John   |   4 | 
+----+---------------+-------------+ 

departments 
+----+------+------------+ 
| id | name | manager_id | 
+----+------+------------+ 
| 1 | H32 |   1 | 
| 2 | X11 |   3 | 
| 3 | H32 |   4 | 
+----+------+------------+ 

employees 
+----+-------------+---------------+------------+-------------+ 
| id | name  | department_id | manager_id | job_type_id | 
+----+-------------+---------------+------------+-------------+ 
| 1 | Billy Bob |    1 |   1 |   1 | 
| 2 | Sandra Lee |    1 |   1 |   3 | 
| 3 | Buddy Holly |    2 |   3 |   1 | 
| 4 | Billy Bob |    3 |   4 |   4 | 
| 5 | Sandra Lee |    3 |   4 |   5 | 
+----+-------------+---------------+------------+-------------+ 

什麼是最有效的執行這種類型的複製操作的執行方式?在Grails的上下文中,我使用InnoDB表引擎來處理MySQL,這是值得的。我期待聽到一些關於你如何做這種「正確方式」的好主意。

- 問候,維克

我已經張貼上引擎收錄a MySQLDump of the example初始化。

編輯 對於它的價值,我發佈一個更簡單/更廣泛的問題here,我得到了普遍的積極響應,表明我不是什麼「做錯了」 ......

+0

如果我可能會問,在整個表格圖中複製副本的動機是什麼?你的問題是讓數據異常警報在我腦海中消失。 – proflux 2010-07-14 20:38:25

+0

@proflux,同意,它似乎好像數據正在通過深拷貝 – 2010-07-15 02:49:26

+0

非標準化運行。 – eillarra 2010-07-15 08:26:05

回答

1

我有使用INSERT INTO ... SELECT語法做了類似的事情。 (C api也有一個MYSQL_OPTION_MULTI_STATEMENTS_ON,你可以用它來運行多個語句,或者你可以使用一個過程)。

這是最有效的,因爲您不必在客戶端和服務器之間移動數據。複製的值是創建新實體的模板。我不明白你爲什麼用這個特殊的數據模型來做這件事。