Целое число для управления миграцией базы данных первичного ключа - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь перейти с первичных ключей на основе int на систему, основанную на guid, и у меня возникают проблемы с миграцией таблицы с собственной ссылкой

Entity
---------
ID
ParentID
AnotherParentID

При запросе к таблице я создаю новый guid ID для каждой строки, но как я могу установить такое же значение guid для строк, которые имеют ID в качестве внешнего ключа для полей ParentID или AnotherParentID?

SELECT 
    newid() as ID,
    (SELECT e.ID ...?) as ParentID,
    (SELECT e.ID ...?) as AnotherParentID,
FROM Entity e

Ответы [ 2 ]

1 голос
/ 17 октября 2019

@ Ответ MRsa дает несколько строк из-за объединения на ParentID или AnotherParentID (поскольку несколько строк могут иметь одинаковый ParentID / AnotherParentID).

Это моя текущая реализация, которая работает, я неуверен, есть ли лучший способ справиться с этим

CREATE TABLE #tmp (
    Id uniqueidentifier null,
    OldId integer null
)

INSERT INTO #tmp (Id, OldId)
SELECT NEWID(), Id FROM OldTable

INSERT INTO NewTable
SELECT
    (SELECT Id FROM #tmp WHERE OldId = i.Id) as ID,
    (SELECT Id FROM #tmp WHERE OldId = i.ParentId) as ParentID,
    (SELECT Id FROM #tmp WHERE OldId = i.AnotherParentID) as AnotherParentID,
FROM OldTable i
1 голос
/ 17 октября 2019

ЕСЛИ paretnID являются внешними ключами:

Select NEWID(), ID, EP.ParentIDGUID, E.ParentID, EP2.AnotherParentID, EP2.AnotherParentIDGUID from dbo.Entity E  
        INNER JOIN 
        (Select MAX(NEWID()) as ParentIDGUID, ParentID FROM dbo.Entity GROUP BY ParentID) EP ON EP.ParentID = E.ParentID
        INNER JOIN 
        (Select MAX(NEWID()) as AnotherParentIDGUID, AnotherParentID FROM dbo.Entity GROUP BY AnotherParentID) EP2 ON EP2.AnotherParentID = E.AnotherParentID

или если они являются внешними ключами в той же таблице:

Select NEWID() as guidID, ID
INTO #tp 
 from dbo.Entity E


Select EP.ID, EP.guidID, E.ParentID, EP2.guidID, E.AnotherParentID, EP3.guidID from dbo.Entity E  
    INNER JOIN 
    #tp EP ON EP.ID = E.ID
    INNER JOIN 
    #tp EP2 ON EP2.ID = E.ParentID
    INNER JOIN 
    #tp EP3 ON EP3.ID = E.AnotherParentID


DROP TABLE #tp 
...