Есть ли способ массовой вставки в две таблицы с FK из одной в другую? - PullRequest
7 голосов
/ 14 июля 2010

Я приведу пример псевдокода моего текущего метода, и если кто-то знает о методе, который не работает по одной строке за раз, я был бы весьма благодарен. Я использую MS SQL Server 2008.

define cursor for the data to be inserted (about 3 million records)
loop
(
    insert record into table 1
    use scope_identity() to get key
    insert record into table 2 that references table 1
)

Я бы предпочел сделать какую-то вставку в обе таблицы одновременно, потому что курсор и цикл работают медленно.

Прежде чем кто-то расскажет о том, почему я вставляю что-то в две отдельные таблицы с отношением 1: 1, это потому, что первую таблицу нельзя изменить, и мне нужна информация во второй (временной) таблице для справки для преобразования данных операции позже.

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

Спасибо!

Дополнительная информация:

Ex

Source:

1 a big  monkey
2 a tall elephant
3 a big  giraffe
4 a tiny cow
5 a tall cow

Dest:

Table 1       Table 2
monkey        1 big
elephant      2 tall
giraffe       3 big
cow           4 tiny
cow           5 tall

Ответы [ 4 ]

1 голос
/ 01 октября 2012

Вы можете использовать объединить на Table1 и и вывод в Table2.

merge Table1
using SourceTable
on 0 = 1
when not matched then
  insert (Animal) values (SourceTable.Animal)
output inserted.ID, SourceTable.Size into Table2(ID, Size);

SQL Fiddle

Примечание: Если у Table2 есть внешний ключ, определенный для Table1, вы не можете сделать вывод напрямую на Table2. В этом случае вы можете использовать временную таблицу в качестве цели вывода и вставить ее в Table2 из временной таблицы.

0 голосов
/ 18 сентября 2012

Используйте IDENTITY_INSERT, триггер VIEW и INSTEAD OF и предварительно заполненные значения идентификаторов с вашей вставкой.

См. Эту скрипту SQL .

Я пытался разбираться с различными вещами в триггере INSTEAD OF, чтобы позволить столбцу идентификации T1 использоваться для T2, но в итоге я потерпел неудачу.

0 голосов
/ 30 сентября 2012
insert into table1
select substring(src.data, 8 /* assuming fixed length as exampled */, len(src.data))
from source src

insert into table2
select t1.id, substring(src.data, 3 /* skip 'a ' */, 7)
from
    table1 t1
        inner join source src
        on substring(src.data, 8, len(src.data)) = t1.data

Для данного примера я не могу сделать лучше ...

0 голосов
/ 15 июля 2010

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


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

...