Предположим, что у нас есть само-ссылочная таблица, как этотКак дублировать строки самостоятельно ссылочной таблицы
CREATE TABLE Month
(
Id int IDENTITY(1,1) PRIMARY KEY,
Title char(128)
)
CREATE TABLE Entity
(
Id int IDENTITY(1,1) PRIMARY KEY,
MonthId int FOREIGN KEY REFERENCES Month(Id),
Name char(128),
ParentId int FOREIGN KEY REFERENCES Entity(Id),
)
Я хочу, чтобы скопировать все строки определенного MonthId другому MonthId. Необходимо также обновить дубликаты parentId, организации и их родители должны быть в том же месяце.
В качестве примера предположим, что мы имеем
Id MonthId Name ParentId
------------------------------------
1 1 name1 null
2 1 name11 1
3 1 name3 null
4 1 name31 3
5 1 name311 4
после копирования monthId = 1 строк monthId = 2 результат должен быть таким:
Id MonthId Name ParentId
------------------------------------
1 1 name1 null
2 1 name11 1
3 1 name3 null
4 1 name31 3
5 1 name311 4
newId1 2 name1 null
newId2 2 name11 newId1
newId3 2 name3 null
newId4 2 name31 newId3
newId5 2 name311 newId4
В NEWID являются значения, порожденные СУБД.
Примечание: Я использую Sql-Server 2012 как СУБД.
Side Примечание: * пожалуйста * не используйте 'полукокса (128)' 'для столбца name' ! Это сделает ** все ** ваши имена будут длиной до 128 символов - более короткие, заполненные пробелами до определенной длины! Это ужасно плохо, трата пространства - вместо этого используйте «varchar (128)», который использует только столько места, сколько необходимо –
Его просто для примера я использую nvarchar (128) в реальном приложении, так как мне нужны символы Unicode. –
Я могу придумать несколько громоздкий способ вставки записей во временную таблицу со старыми идентификаторами и старыми родительскими идентификаторами, а затем вставить их в основную таблицу с правильными значениями, но я уверен, что это можно сделать в более прямо вперед, поэтому я не буду публиковать это как ответ. –