我實際上一直在做一個這樣的項目。我的解決方案雖然不花哨,但迄今爲止已被證明是有效的。惱人的部分是設置過程。我很樂意接受批評和改進建議。
- 創建所有必要的表的「鏡子」模式/ DB(我已經有新的[ApplicationTableName])
- 對於每個PKEY/FKEY,創建一個「佔位符」列(我已經走了與p [ColumnName])
- 將現有數據映射到佔位符鍵,索引爲1.(這很煩人,但可以使用排名功能。)
- 通過佔位符鍵以降序插入到應用程序中(降序爲重要!)
- 使用排名函數更新您的「鏡像」表(請參閱示例)
- 根據需要重複使用所需的多個表格中的驅動/插入值。
例子:
鑑於此架構...
CREATE TABLE Accounts (
AccountID int identity(1,1) not null,
Name varchar(500) not null
)
CREATE TABLE Users(
UserID int identity(1,1) not null,
AccountID int not null,
Name varchar(500) not null
)
CREATE TABLE NewUsers(
pUserID int not null,
UserID int not null,
AccountID int not null,
Name varchar(500)
)
而這個數據
INSERT INTO NewUsers VALUES
(1,0,0,'Bob'),
(2,0,0,'Sally'),
(3,0,0,'Jeff'),
(4,0,0,'Sam')
說每次我們 「創造」 一個帳戶的時間,我們要創建這些4默認用戶...這看起來像這樣
DECLARE @AccountID int --this is scalar, so we'll use scope_identity() to grab it.
INSERT INTO Account VALUES('MyNewAccountID')
SELECT @AccountID = SCOPE_IDENTITY()
--Prepare NewUsers w/ derived accountID
UPDATE NewUsers SET AccountID = @AccountID
--Do our "application" insert
INSERT INTO Users(AccountID,Name)
SELECT AccountID,Name
FROM NewUsers
ORDER BY pUserID DESC;
--Capture inserted ID's for use in other tables (where we've derived pUserID)
WITH InsertedUsers AS(
SELECT
--use dense rank, it handles fkey mappings too
DENSE_RANK() OVER(ORDER BY UserID DESC) as pUserID,
UserID
FROM Users
)
UPDATE NewUsers SET UserID = iu.UserID
FROM NewUsers nu
JOIN InsertedUsers iu
ON iu.pUserID = nu.pUserID
SELECT TOP 100 * FROM Account ORDER BY 1 DESC
SELECT TOP 100 * FROM Users ORDER BY 1 DESC
所以,現在如果未來表需要UserID進入應用程序(並且具有派生pUserID,),我們可以通過加入pUserID從NewUsers獲取它。
來源
2016-04-26 21:49:22
Ron
這沒有意義 –
@PouriaSharif什麼是沒有意義的? –