2010-07-14 4 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 | 
+----+-------------+---------------+------------+-------------+ 

Что является наиболее эффективным способом реализации этого типа операции копирования? Для чего стоит работать с MySQL, используя движок таблицы InnoDB, в контексте Grails. Я с нетерпением жду некоторых хороших идей о том, как вы делаете что-то вроде этого «правильно».

- Привет, Вик

Я отправил a MySQLDump of the example инициализации на Pastebin.

EDIT Для чего это стоит, я отправил гораздо проще/более широкий вопрос here и я получил в целом положительные отзывы, предполагая, что я не «просто делают это неправильно» ...

+0

Если я могу спросить, какова ваша мотивация для создания копий по всему графику таблицы? Ваш вопрос заключается в том, что предупреждения об аномалии данных уходят в мою голову. – proflux

+0

@proflux, согласен, кажется, что данные денормализуются, делая глубокую копию. –

+0

Тревоги здесь тоже. – eillarra

ответ

1

У меня есть сделал аналогичную вещь, используя синтаксис INSERT INTO ... SELECT. (В C api также есть MYSQL_OPTION_MULTI_STATEMENTS_ON, который вы можете использовать для запуска нескольких операторов с помощью. Или вы можете использовать процедуру).

Это наиболее эффективно, так как вам не нужно перемещать данные между клиентом и сервером. Значение, скопированное, было шаблоном для создания нового объекта. Я не понимаю, почему вы делаете это с этой конкретной моделью данных.

Смежные вопросы