Копирование строк в базе данных, когда строки имеют детей - PullRequest
2 голосов
/ 06 августа 2010

Мне нужно сделать копию строки в таблице, а также скопировать все строки, которые ссылаются на нее через ее внешний ключ в других таблицах. А затем скопируйте все строки, которые ссылаются на эти строки.

Проблема в том, что когда я делаю копию строки, ключ меняется. Как я могу распространить эти изменения через отношения между таблицами?

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Вы можете написать хранимую процедуру, которая реализует всю логику копирования.

По существу:

  1. Вставить строку копирования в основную таблицу - сохранить новый идентификатор в переменной
  2. Вставить копия каждой строки в дочерних таблицах, ссылаясь на FK в переменной. Сохраните идентификатор дочерней строки в переменной2
  3. Вставлять новые строки в таблицы, зависящие от дочерней таблицы, ссылаясь на FK в переменной2.

Короче говоря, запишите сохраненный процесс, который начинается сверху и спускается по столько таблиц, сколько необходимо.

1 голос
/ 06 августа 2010

Немного «хака», но я часто добавляю столбец «copy_of_id», чтобы я мог сохранить старый идентификатор и затем скопировать все строки в зависимых таблицах для вновь созданного значения.

Это не красиво, но имеет преимущества (например, отслеживание происходящего человеком).

Вы также можете использовать вспомогательную таблицу для этого, конечно.Содержит старые идентификаторы и новые столбцы идентификаторов.Это не будет загрязнять вашу основную таблицу.

0 голосов
/ 06 августа 2010

При создании новой «родительской строки» @@ IDENTITY и SCOPE_IDENTITY () будут содержать идентификатор вашего нового заголовка.

Затем вы можете использовать их для создания ваших "дочерних строк", таких как

INSERT INTO parent_table (parent_field1, parentfield2) VALUES('Some stuff', 'Other stuff');

INSERT INTO child_table (parent_id, other_field) VALUES(SCOPE_IDENTITY(), 'Etc.')

Посмотрите на MSDN @@ IDENTITY и SCOPE_IDENTITY () для примеров кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...