Я никогда не слышал о каком-либо стандартном способе для этого, в промышленности или в противном случае. Когда это возможно, вы хотите определить/сгенерировать первичные ключи перед добавлением строк в базу данных. Естественные ключи идеально подходят для этого, и гиды тоже будут работать. Краткий пример:
-- 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
Однако, если вы вставляете несколько родителей и их детей все сразу (и это звучит, как это то, что вы столкнулись), она становится сложнее. У меня был разумный успех с вариантами следующей методологии.
Сначала добавьте каждый «новый» родительский элемент в родительскую таблицу. Как только это будет сделано, запросите родительскую таблицу и извлеките новый идентификатор, назначенный каждому родителю, и назначьте его соответствующим дочерним строкам при их загрузке. Псевдо-код:
INSERT ParentSet
SELECT NewIds of ParentSet just loaded
INSERT ChildSet using these NewIds
Хитрость заключается в идентификации и извлечении (только) новых родителей, которые мы только что ввели. Если у вас есть натуральный ключ (уникальное имя продукта, OrderId, возможно, что-то, основанное на данных даты и времени), используйте это. Если нет, вам нужно подделать один. Я сделал трюки, в которых я изначально создавал указатель для каждого добавляемого родителя, задавал произвольный столбец этому родителю во время интимной вставки, вытаскивал новые идентификаторы, читая только для этих указателей, а затем заменяя указатели на соответствующий столбец стоимость. Более псевдо-код:
Добавить Колум в родительский набор, настроить с уникальным идентификатором GUID в каждом ВСТАВИТЬ родителя ... колонка XYZ = новый справ ВЫБРАТЬ NewID от Родителя, где XYZ в (список GUIDs генерируемой) UPDATE родительский набор XYZ = правильное значение где (фильтр или соединение основано на NewId) Дети INSERT (с использованием полученного NewId)
Надеюсь, что это помогает, его трудно объяснить без конкретных структур и выборочных данных.