Установить основанную вставку в две таблицы с отношением от 1 до 0-1
-
06-07-2019 - |
Вопрос
У меня есть две таблицы: первая имеет первичный ключ, который является идентификатором, вторая имеет первичный ключ, которого нет, но этот ключ имеет ограничение внешнего ключа обратно к первичному ключу первой таблицы.
Если я вставляю по одной записи за раз, я могу использовать Scope_Identity, чтобы получить значение для pk, только что вставленного в таблицу 1, которое я хочу вставить во вторую таблицу.
Моя проблема в том, что у меня есть много записей, выбранных для выборок, которые я хочу вставить в обе таблицы. Я не смог придумать, как сделать эти вставки на основе набора.
Мое текущее решение - использовать курсор, вставить в первую таблицу, получить ключ с помощью scope_identity, вставить во вторую таблицу, повторить.
Мне не хватает решения без курсора?
Решение
Да, посмотрите предложение вывода в Книгах онлайн.
Другие советы
У меня была эта проблема только на этой неделе: кто-то ввел в схему таблицу с бессмысленным суррогатным ключом, где естественным образом используются ключи. Без сомнения, я скоро это исправлю :) до тех пор я работаю над этим, создавая таблицу данных для INSERT
из: это может быть постоянная или временная базовая таблица или производная таблица ( см. ниже), которая в любом случае должна соответствовать вашему желанию решения на основе множеств. Используйте соединение между этой таблицей и таблицей со столбцом IDENTITY
в натуральном ключе, чтобы найти автоматически сгенерированные значения. Вот краткий пример:
CREATE TABLE Test1
(
surrogate_key INTEGER IDENTITY NOT NULL UNIQUE,
natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);
CREATE TABLE Test2
(
surrogate_key INTEGER NOT NULL UNIQUE
REFERENCES Test1 (surrogate_key),
data_col INTEGER NOT NULL
);
INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
FROM (
SELECT '0000000001', 22
UNION ALL
SELECT '0000000002', 55
UNION ALL
SELECT '0000000003', 99
) AS DT1 (natural_key, data_col);
INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
FROM (
SELECT '0000000001', 22
UNION ALL
SELECT '0000000002', 55
UNION ALL
SELECT '0000000003', 99
) AS DT1 (natural_key, data_col)
INNER JOIN Test1 AS T1
ON T1.natural_key = DT1.natural_key;