2015-05-01 50 views
1

對於一個項目,我創建了一個數據庫模型,並且我不完全確定我是否在正確的道路上。我試圖找到答案,但空了。如何定義其中一個是主鍵的兩列之間的關係?

我有兩個表。其中一個是另一個的「子類」。例如:AnimalHorseHorse有一個名爲HorseId的主鍵,而Animal有一個名爲AnimalId的主鍵。 HorseId是涉及AnimalId的外鍵。到現在爲止還挺好。

現在我想添加一列TypeAnimal表,所以我知道它是哪個動物。 Animal現在有AnimalIdType作爲列。

表動物

AnimalId (PK) 
Type 

表馬

HorseId (PK, FK ref Animal.AnimalId) 

然而,標識的馬應該始終有 '馬' 爲TypeAnimalId。一種可能性是將Type作爲主鍵的一部分,但這看起來不正確,因爲AnimalId唯一標識了其中的一行。

另一種選擇是創建包含兩列的備用密鑰。但是,我的驗證器告訴我'主鍵是備用鍵的一個子集'(這是正確的),並且警告我。不允許嗎?

我應該如何解決這個問題?

在此先感謝!

+0

您是否試圖創建一個規則,如果Animal表中存在AnimalID,則強制Type爲Horse? – mucio

+0

如果可能的話,這將解決所有問題。 我在第一篇文章中說的只是解決部分問題。它確保AnimalId只能有一個類型。您真正想要的是確保類型與Id所在的表相同。 但是,我不確定是否要在數據庫級別製作這樣的約束。如果我能做第一部分,我也會很開心。解決方案中的 – Century

+0

將會是一個觸發器,當您在'Animal'中用'Type = Horse'插入記錄時,在'Horse'中插入一個新行。你正在使用哪個數據庫? – mucio

回答

0

使用觸發器解決了多個問題。 我不得不改變外鍵關係,因爲它被定義爲錯誤的方式。 AnimalId應參考HorseId如果我想能夠在Horse中創建新記錄。
此外,替代密鑰不是必需的。主鍵和外鍵已確保Animal內的記錄引用Horse中的一條記錄,因此總是會有一條記錄Type
爲了確保TypeAnimal是正確的,我已經能夠創建一個觸發器。在插入了Horse中的記錄後,觸發器會自動將一條記錄插入到Animal中,記錄正確的爲TypeId。 觸發器和主鍵Animal確保沒有人可以直接輸入Animal並插入錯誤的Type

觸發如下:

CREATE trigger Trigger 
ON Horse 
AFTER INSERT 
AS 
DECLARE @Id uniqueidentifier 
SET @Id = (SELECT HorseId FROM inserted) 
INSERT Animal VALUES (@Id, 'Horse') 

感謝您指出我在正確的方向!

相關問題