我希望在這個問題上我不會太長時間,我只是想確保我所要求的是完全清楚的(我認爲它相當混亂:)。複製關係表數據
我有一堆表的數據庫與我所有的外鍵約束設置。關係有時會有幾個表格深度,還有一些情況是一個孩子與多個父表格相關聯。我想插入我的「頂級」表格行的一個副本,以及與其相關的所有子表數據(保持關係完整性)。也就是說,我的新頂級行通過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,我得到了普遍的積極響應,表明我不是什麼「做錯了」 ......
如果我可能會問,在整個表格圖中複製副本的動機是什麼?你的問題是讓數據異常警報在我腦海中消失。 – proflux 2010-07-14 20:38:25
@proflux,同意,它似乎好像數據正在通過深拷貝 – 2010-07-15 02:49:26
非標準化運行。 – eillarra 2010-07-15 08:26:05