Надеюсь, что я не слишком долго наматывался этим вопросом, я просто хочу убедиться, что то, что я прошу, совершенно ясно (я думаю, что это довольно запутанно :).Копирование данных реляционной таблицы
У меня есть база данных с кучей таблиц со всеми ограничениями внешнего ключа. Отношения иногда представляют собой несколько таблиц, а также случаи, когда дочерний элемент связан с несколькими родительскими таблицами. Я хочу вставить копию одной из строк таблицы «верхнего уровня» и всех дочерних табличных данных, относящихся к ней (сохраняя реляционную целостность). То есть моя новая строка верхнего уровня получает свой собственный первичный ключ (через 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 и я получил в целом положительные отзывы, предполагая, что я не «просто делают это неправильно» ...
Если я могу спросить, какова ваша мотивация для создания копий по всему графику таблицы? Ваш вопрос заключается в том, что предупреждения об аномалии данных уходят в мою голову. – proflux
@proflux, согласен, кажется, что данные денормализуются, делая глубокую копию. –
Тревоги здесь тоже. – eillarra