2015-07-20 83 views
1

我有一個表model與主鍵aliasSQL Server將主鍵更改爲不同的[新]列並更新外鍵引用

我有另一個表device和一張桌子error,每個有引用model的的alias主鍵的外鍵。

我需要做的是添加一個新列到model,它將作爲新的主鍵(int indentity(1,1)),因此使alias只是一個普通的舊列。這意味着我還需要正確更新deviceerror中的外鍵引用以反映model中的新主鍵列。

問題是如何做到這一點凌亂的業務乾淨,並在正確的順序。我可以修改我們用來從頭開始創建數據庫的腳本,沒有任何問題,但是混亂的部分是如何更新現有的數據庫。

我對這樣的複雜行爲的知識有限,而不是繼續花費第二天或第二天的時間來研究如何以正確的方式做到這一點,並且可能使我的db數據庫數次,我寧願做正確的第一次。

回答

0
  1. 將標識列添加到模型。
  2. 將新的FK列添加到設備和錯誤。
  3. 更新設備和錯誤,將新的FK列設置爲Model的新PK的值,其中舊的FK =舊的PK(別名)。
  4. 下降,由設備和錯誤的老FK列
0

這聽起來像你需要進行幾個步驟:

-- Assuming you have PK and FK names: 
CREATE TABLE #one (alias VARCHAR(10) NOT NULL, meta VARCHAR(MAX)) 
CREATE TABLE #device (alias VARCHAR(10) NOT NULL, device_info VARCHAR(MAX)) 

ALTER TABLE #one ADD CONSTRAINT pk_one PRIMARY KEY (alias) 
ALTER TABLE #device ADD CONSTRAINT fk_device_one FOREIGN KEY (alias) REFERENCES #one(alias) 

-- Data setup: 
INSERT INTO #one (alias, meta) VALUES ('one', '') 
INSERT INTO #one (alias, meta) VALUES ('two', '') 
INSERT INTO #one (alias, meta) VALUES ('three', '') 
INSERT INTO #one (alias, meta) VALUES ('four', '') 

INSERT INTO #device (alias, device_info) VALUES ('one', '') 
INSERT INTO #device (alias, device_info) VALUES ('two', '') 
INSERT INTO #device (alias, device_info) VALUES ('three', '') 
INSERT INTO #device (alias, device_info) VALUES ('four', '') 

-- STEP 1: Add new fields 
ALTER TABLE #one ADD one_id INT IDENTITY(1,1) 
ALTER TABLE #device ADD one_id INT 

-- STEP 2: Update dependent table data 
UPDATE #device SET #device.one_id = #one.one_id FROM #device, #one WHERE #device.alias = #one.alias 

-- STEP 3: Update Constraints on primary table 
ALTER TABLE #one DROP CONSTRAINT pk_one 
ALTER TABLE #one ADD CONSTRAINT pk_one PRIMARY KEY (one_id) 

-- STEP 4: Update FK Constraints 
ALTER TABLE #device DROP CONSTRAINT fk_device_one 
ALTER TABLE #device ADD CONSTRAINT fk_device_one FOREIGN KEY (one_id) REFERENCES #one(one_id) 

我認爲這是可能的查詢系統表收穫你的約束標識並將上述代碼重寫爲存儲過程,以便您只需調用SPU即可更新依賴/客戶端表數據並構建約束。讓我知道你是否想要更多的例子。