Копирование отношения «один ко многим» между двумя таблицами в две другие таблицы (SQL 2005) - PullRequest
4 голосов
/ 19 октября 2010

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

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

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

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

Надеюсь, мое описание имеет смысл, и спасибо за ваше мнение.Дайте мне знать, если я смогу уточнить.

Ответы [ 2 ]

4 голосов
/ 19 октября 2010

Когда я сделал это, я сделал это, сохранив старый идентификатор после вставки в новую таблицу.

Некоторые люди добавляют временный столбец со старым идентификатором, но я знаю лучший способ.

Вы можете использовать предложение OUTPUT для вставки вставленных записей во временную таблицу (с новыми и старыми идентификаторами в качестве таблицы отображения. Затем присоединитесь к ней при вставке дочерних записей.

Примерно так (сырой)

DECLARE @MyTableVar TABLE (
    NewID INT,
    OldID INT
)

INSERT NewParentTable
OUTPUT
    INSERTED.ID,
    old.ID
INTO @MyTableVar
SELECT *
FROM OldParentTable old


INSERT NewChildTable
SELECT
    old.ID,
    t.NewID,
    old.name
FROM OldChildTable old
INNER JOIN @MyTableVar t ON t.OldID = old.ParentID
1 голос
/ 19 октября 2010

Вы должны сохранить исходный идентификатор в отдельном столбце таблицы с соответствующим parentID. Таким образом, в таблице назначения вам нужно добавить столбец parentID_orig (не автоматический номер), чтобы сохранить ссылку.

...