2016-03-19 20 views
4

下面是我想要創建的表的DDL。但是,我希望「Expertise_breed」屬性來自「Expertise_animal」。例如,如果'狗'進入'Expertise_animal',我不想進入貓的品種。我將如何去實現這一目標? 我與SQL Server Management Studio中工作2012SQL - 如何根據另一個屬性限制一個屬性的數據輸入?

CREATE TABLE tExpertise 
(
Expertise_ID  int   NOT NULL PRIMARY KEY, --E.G Data '001' 
Expertise_type  varchar(8) NOT NULL,    --E.G Data 'Domestic' 
Expertise_animal varchar(30) NOT NULL,    --E.G Data 'Dog' 
Expertise_breed  varchar(30) NOT NULL    --E.G Data 'Poodle' 
) 
+1

你如何教你的SQL Server「Poodle'確實是'狗'? – Ralph

+2

您可以創建檢查約束 – Dejan

+0

檢查約束看起來像一個小型數據庫。 –

回答

-1

您可以創建在插​​入和/或更新一個觸發器,比較這兩列的每一行。你可以通過'插入'別名來引用插入的條目。

如果你知道什麼映射是允許的(例如dog x poodle),你可以將它存儲在某個表中,並在插入時加入它以過濾掉錯誤的映射。

+0

爲什麼downvote? –

2

這是關係數據的情況,應該使用關係表。

我想有三個 AnimalClassification - (國內,野,等) AnimalSpecies(狗,貓,山羊) AnimalBreed(貴賓犬,比格犬) 動物種類將有一個外鍵,動物分類即 狗 - 國內 動物品種將有一個外鍵的動物物種,即 小獵犬 - 犬

-1

從理論上講,你要可以使用表級constraints,這樣做是以下(沒有測試)的一個通用的方法來實現的:

CREATE FUNCTION dbo.validateExpertise(
    @expertise_type varchar(8), 
    @Expertise_animal varchar(30), 
    @Expertise_breed varchar(30) 
) 
RETURNS BIT 
AS 
BEGIN 
    IF (@Expertise_animal == 'dog' AND @Expertise_breed != 'dog') 
     RETURN 0; 

    -- other validations can come here 

    RETURN 1; 
END 
GO 

-- add a table level constraint 
-- WITH NOCHECK can be used to not check existing data 
ALTER TABLE detailTable ADD CONSTRAINT chkExpertise 
     CHECK (dbo.validateExpertise(expertise_type, Expertise_animal, Expertise_breed) = 1) 

雖然這可能對您有所幫助,但不建議在數據庫級別進行如此複雜的驗證。複雜的驗證意味着(至少)在您的應用程序的業務層中實現,這通常在Logic tier(通常爲ASP.NET MVC,WCF服務,Web服務等)中(某些驗證也放入了表示層爲了避免往返時間延遲。

數據庫是指主要用於數據持久化和獲取。當然,簡單的限制,如FK S,unique約束,列級約束等的歡迎,因爲他們作爲一個良好的安全性net。

另外,請記住,表中的每個INSERTUPDATE都會觸發上述約束,並可能嚴重降低pe針對涉及大量記錄的查詢的性能。

相關問題