2010-07-14 51 views
5

Tôi hy vọng tôi không quá lo lắng trong câu hỏi này, tôi chỉ muốn đảm bảo rằng những gì tôi yêu cầu là hoàn toàn rõ ràng (tôi nghĩ nó khá khó hiểu :).Sao chép dữ liệu bảng quan hệ

Tôi đã có một cơ sở dữ liệu với một loạt các bảng có tất cả các ràng buộc khóa ngoại được thiết lập. Quan hệ đôi khi có nhiều bảng sâu, và cũng có những trường hợp một đứa trẻ liên quan đến nhiều hơn một bảng cha. Tôi muốn chèn một bản sao của một trong các hàng bảng "cấp cao nhất" của tôi và tất cả dữ liệu bảng con liên quan đến nó (giữ nguyên toàn vẹn quan hệ). Tức là hàng cấp cao mới của tôi có khóa chính mới (thông qua auto_increment) và tất cả các hàng con mới có các khóa chính của riêng chúng (một lần nữa thông qua auto_increment) và tất cả thông tin khóa ngoài của các bảng liên quan tương tự với dữ liệu tôi đã sao chép (chỉ với các khóa chính mới được tạo). Vì vậy, bây giờ tôi sẽ có một bản sao của dữ liệu quan hệ được độc lập có thể thay đổi từ bản gốc.

Để làm ví dụ của tôi cụ thể hơn, tôi đã cẩn thận thiết lập một ví dụ tương tự, nhưng đơn giản hơn. Cho phép xác định các bảng sau:

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

Tất cả các lĩnh vực id xanh là chìa khóa chính auto_update, và những người thân vàng được lập chỉ mục cột với ràng buộc khoá ngoại. Giả sử cơ sở dữ liệu có dữ liệu sau đây trong đó ban đầu:

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 | 
+----+-------------+---------------+------------+-------------+ 

Bây giờ hãy nói điều tôi muốn làm là tạo bản sao quan hệ của bộ phận H32 (id = 1).

Những gì tôi nên kết thúc với một cái gì đó như sau (giá trị thực sự rõ ràng của khóa chính là không quan trọng, tính toàn vẹn tham chiếu là).

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 | 
+----+-------------+---------------+------------+-------------+ 

Cách hiệu quả nhất để triển khai loại thao tác sao chép này là gì? Đối với những gì nó có giá trị tôi đang làm việc với MySQL, sử dụng công cụ bảng InnoDB, trong bối cảnh của Grails. Tôi rất mong được nghe một số ý tưởng hay về cách bạn làm điều gì đó như thế này "đúng cách."

- Trân trọng, Vic

Tôi đã đăng a MySQLDump of the example khởi tạo trên PasteBin.

EDIT Đối với những gì nó có giá trị, tôi gửi một đơn giản hơn nhiều/câu hỏi rộng hơn here và tôi đã phản ứng chung là tích cực, cho thấy rằng tôi không phải là "chỉ làm nó sai" ...

+0

Nếu tôi có thể hỏi, động lực của bạn để tạo bản sao xuống toàn bộ biểu đồ bảng là gì? Câu hỏi của bạn là làm cho dữ liệu báo động bất thường biến mất trong đầu tôi. – proflux

+0

@proflux, đã đồng ý, dường như dữ liệu đang được chuẩn hóa bằng cách thực hiện một bản sao sâu –

+0

Báo thức đang chạy ở đây. – eillarra

Trả lời

1

Tôi có thực hiện một điều tương tự bằng cách sử dụng cú pháp INSERT INTO ... SELECT. (C api cũng có một MYSQL_OPTION_MULTI_STATEMENTS_ON mà bạn có thể sử dụng để chạy nhiều câu lệnh với. Hoặc bạn có thể sử dụng một thủ tục).

Đây là hiệu quả nhất, vì bạn không phải di chuyển dữ liệu giữa máy khách và máy chủ. Giá trị được sao chép là một mẫu để tạo một thực thể mới. Tôi không hiểu tại sao bạn làm điều này với mô hình dữ liệu đặc biệt này.

Các vấn đề liên quan