2012-01-31 19 views
0

好的,我使用的是SQL Server 2008 R2,並且有一些關係需要隨時隨地輪換。這裏是我的示例數據庫設計(不是實際的,但顯示了問題)。用於修復不良關係的T-SQL查詢

Table - Products 
Columns: ProductID - primary key 
     ProductInfo - irrelevant to problem 
     ModelID - foreign key to Models table 
     MfgrID - foreign key to Mfgrs table 

Table - Models 
Columns: ModelID - primary key 
     ModelInfo - irrelevant to problem 

Table - Mfgrs 
Columns: MfgrID - primary Key 
     MfgrInfo - irrelevant to problem 

在這種情況下,產品是一種模型,由Mfgr製造。我需要做的是將Mfgrs表格與Models表格相關聯,因爲給定的模型是由Mfgr製作的,並且單獨鏈接到最終產品就是糟糕的設計?

這模擬了一個具有實時數據的實際數據庫,因此它不僅僅是一個練習。我想要做的是向模型添加一列,將其稱爲MfgrID,並從模型創建一個關係到Mfgrs。然後Mfgr將與模型有一對多的關係,模型將與產品有一對多的關係,這個世界將是一個更好的地方!

好吧,無論如何,我的世界將是一個更好的地方。

我想創建基於舊的新關係,以便每個模型獲得指向該模型的任何給定產品的Mfgr的MfgrID 。一旦建立,我會回去刪除產品與Mfgrs的關係。

有任何問題嗎?我明白任何和所有的想法,我不斷收到自己糊塗試圖設計一個簡潔的查詢做到這一點...

戴夫

+0

我希望SQL中,可以解決不良關係! ;-) – Mithrandir 2012-01-31 19:04:54

+0

我也是,@Mithrandir ... – JNK 2012-01-31 19:05:32

回答

2

如果你只有每一個型號的產品,這應該這樣做;

ALTER TABLE Models ADD MfgrID INT NULL FOREIGN KEY REFERENCES Mfgrs(MfgrID); 

UPDATE m SET MfgrID = p.MfgrID 
    FROM Models m JOIN Products p ON m.ModelID=p.ModelID; 

並且如果您希望MfgrID是強制性的,並且您在該列中沒有空值,

ALTER TABLE Models ALTER COLUMN MfgrID INT NOT NULL; 

而只是爲了確保,你不應該在你的生產數據庫運行從互聯網上任何人的隨機腳本,而無需測試第一;-)

+0

嗯,是的,好點。我有一個真正的數據與開發數據庫玩,但感謝您的警告! – DaveN59 2012-01-31 19:35:36

+0

順便說一句,你的腳本工作得很好!它讓我頭疼,試圖找出那個人的語法,不知道爲什麼...... – DaveN59 2012-01-31 19:53:07