Я никогда не слышал о каких-либо стандартных способах сделать это, в промышленности или иным образом. По возможности, вы хотите определить / сгенерировать первичные ключи перед добавлением строк в базу данных. Естественные ключи идеально подходят для этого, и гиды тоже подойдут. Краткий пример:
-- Start with Parent row and several Children rows to insert
SET @GuidPK = newid()
INSERT parent row using @GuidPK
INSERT children rows using @GuidPK
Если вы не можете сделать это (что произойдет, если вы используете столбец идентификаторов в качестве первичного ключа родителя) и вставляете одного родителя (+ 0 или более дочерних элементов), все равно просто:
-- Start with Parent row and several Children rows to insert
INSERT Parent -- Presums one at a time!
SET @NewPK = scope_identity()
INSERT Children using @NewPK
Однако, если вы вставляете сразу нескольких родителей и их детей (и, похоже, это то, с чем вы сталкиваетесь), это будет сложно. Я имел разумный успех с вариантами следующей методологии.
Сначала добавьте каждого «нового» родителя в родительскую таблицу. Как только это будет сделано, запросите родительскую таблицу и извлеките новый Id, назначенный каждому родителю, и назначьте его соответствующим дочерним строкам, когда они будут загружены. Код Псуэдо:
INSERT ParentSet
SELECT NewIds of ParentSet just loaded
INSERT ChildSet using these NewIds
Хитрость в том, чтобы идентифицировать и извлечь (только) новых родителей, которых мы только что ввели. Если у вас есть ключ natrual (уникальное имя продукта, OrderId, может быть, что-то, основанное на данных даты и времени), используйте его. Если нет, вам нужно подделать один. Я проделал трюки, в которых изначально генерировал guid для каждого добавляемого родителя, устанавливал произвольный столбец для этого родителя во время первоначальной вставки, извлекал новые идентификаторы, читая только для этих направляющих, а затем заменяя направляющие соответствующим столбцом. значение. Более псевдо-код:
Добавьте столбец к родительскому набору, настройте с уникальным guid в каждом
ВСТАВИТЬ родительский ... столбец XYZ = новый guid
ВЫБЕРИТЕ NewId из Parent, где XYZ (список сгенерированных направляющих)
ОБНОВЛЕНИЕ родительского набора XYZ = правильное значение где (фильтр или объединение на основе NewId)
ВСТАВИТЬ детей (используя полученный NewId)
Надеюсь, это поможет, это трудно объяснить без конкретных структур и примеров данных.