SQL: Можно ли вставлять в две таблицы одновременно с автогенерированным выводом идентификатора из первой таблицы во вторую? - PullRequest
0 голосов
/ 06 мая 2020

Моя база данных содержит две таблицы FileStore и FileRepository.

Таблица FileStore содержит 3 столбца: Id (автоматически сгенерированный уникальный идентификатор), FileName и Description -> В исходном состоянии с демонстрационными данными

FileStore Initial state

Таблица FileRepository содержит 3 столбца: Id (автоматически сгенерированный уникальный идентификатор), Name и FileId (это относится к столбцу Id в таблице FileStore) -> В исходном состоянии с демонстрационными данными

FileRepository Initial state

Я получаю массив идентификаторов FileStore в качестве критерия поиска. При этом мне нужно сначала создать повторяющуюся строку в таблице FileStore для каждого из удовлетворенных критериев. Мне нужно создать повторяющуюся строку для второй таблицы FileRepository на основе тех же данных в столбце FileId. Здесь, но мне нужно обновить столбец FileId вновь созданной строки с помощью автоматически сгенерированного столбца Id из операции FileStore.

Скажите, ссылаясь на прикрепленные изображения, если мне нужно дублировать файл файлов 1 (с идентификатором b3304dc4- 4f2e-46d4-8f64-a597edb02e96 ) и File 2 (с Id 7cb40baf-1ecf-4e5f-92ff-57029a20e623 ) вот как в таблицах должны быть данные после операции FileStore db после дублирования. data таким образом: Updated FileStore db

FileRepository db после дублирования должны иметь данные таким образом: Updated FileRepository db

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

Для первой таблицы я могу вставить и получить вставленные идентификаторы следующим образом:

INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id as InsertedIds
SELECT
FileName, Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')

Но не был уверен в запросе на обновление таблица FileRepository, которая принимает InsertedIds в качестве входных данных

INSERT INTO FileRepository(Name,FileId)
SELECT
Name, {{How do I use InsertedDetails here?}}
from FileRepository
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')

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

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Как я уже упоминал, вам нужно использовать предложение OUTPUT. Это псевдо - SQL при отсутствии данных по расходным образцам и ожидаемых результатов. Вам нужно будет удалить / изменить части в фигурных скобках ({}) соответствующим образом:

DECLARE @Output table (ID uniqueindentifier,
                       {Other Columns});

INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id, {Other Columns}
INTO @Output
SELECT FileName,
       Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623');

INSERT INTO FileRepository(Name,FileId)
SELECT FR.Name,
       O.ID
from FileRepository FR
     {CROSS} JOIN @Output O {ON Some Condition}
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
0 голосов
/ 06 мая 2020
  1. Сначала вставьте данные родительской таблицы.
  2. Затем

    INSERT INTO FileRepository (`id`, `Name`,`FileId`)   
    VALUES('id_or_auto_generated','name value', SELECT SCOPE_IDENTITY())
    

SELECT SCOPE_IDENTITY (); вернет последний автоматически сгенерированный идентификатор подключения к базе данных сервера SQL.

Для других баз данных: Следуйте этому сообщению

...