2010-09-15 120 views
1

作爲問題標題,有沒有辦法做到這一點?SqlServer約束字段值依賴於另一個字段值

如:

DrivingLicence 
--------------- 
CanDriveCar  (bool) 
CanDriveMotorbike (bool) 
CanDriveBus  (bool) 

你不能駕駛公交車沒有車牌,所以我想在DB到如果有人試圖給別人公車牌照時,他們沒有汽車拋出異常執照。

回答

2
ALTER TABLE dbo.DrivingLicence ADD CONSTRAINT 
    NameOfConstraint CHECK (CanDriveBus=0 OR CanDriveCar=1) 
1

馬丁給了你一個可能的答案,但它是從您的帖子不清楚你的數據模型是什麼:做汽車牌照和公車牌照具有相同的許可證號或不是?換一種說法,如果我擁有汽車執照並學習駕駛公共汽車,我是否獲得第二個許可證或僅僅是現有許可證上的一張印章?

如果他們是單獨的許可證,那麼我認爲他們將在表中的單獨行,因爲表的主鍵是 - 希望! - LicenceNumber。在這種情況下,CHECK約束將不起作用,因爲它們只適用於一行中的值;您需要使用觸發器來檢查添加新驅動程序時驅動程序已擁有哪些許可證。

那麼你的選擇是:

  1. 驅動器永遠只能有一個唯一的號碼一個許可證:使用CHECK約束
  2. 驅動程序可以有不同的類型有不同數量的多個許可證:使用觸發器
  3. 這要複雜得多:使用存儲過程或應用程序代碼插入新的許可證

您的消息表明1,但它是一個有點不清楚。即使情況如此,您可能會考慮第二張名爲DrivingLicenceQualifications的表格或其他:如果一個許可證可以有很多資格,並且您希望在將來添加新的資格,那麼這將更加靈活。

而僅供參考,MSSQL中沒有布爾數據類型,也許你的意思是BIT?

+0

martins的答案正是我所期待的,但是謝謝你指出了一些我沒有考慮過的事情。 – fearofawhackplanet 2010-09-15 11:33:20

相關問題