Sql Server约束字段值依赖于另一个字段值

时间:2010-09-15 10:47:13

标签: sql-server sql-server-2008 database-design constraints

作为问题标题,有没有办法做到这一点?

例如:

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

如果没有汽车执照,你就无法驾驶公共汽车,所以如果有人在没有汽车执照的情况下试图给某人一辆公共汽车执照,我希望数据库抛出异常。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

Martin给了您一个可能的答案,但是从您的帖子中不清楚您的数据模型是什么:汽车执照和公交车执照是否具有相同的许可证号码?换句话说,如果我有车牌并学会驾驶公共汽车,我是否可以获得第二张牌照或只是在现有牌照上盖章?

如果它们是单独的许可证,那么我认为它们将是表格中的单独行,因为表格的主键是 - 希望! - LicenceNumber。在这种情况下,CHECK约束将不起作用,因为它们仅适用于一行中的值;您需要使用触发器来检查添加新驱动程序时驱动程序已有的许可证。

所以你的选择是:

  1. 驱动程序只能拥有一个带有一个唯一编号的许可证:使用CHECK约束
  2. 驱动程序可以拥有多个具有不同编号的不同类型的许可证:使用触发器
  3. 比这更复杂:使用存储过程或应用程序代码插入新许可证
  4. 你的帖子暗示1,但有点不清楚。即使是这种情况,您也可以考虑使用第二个名为DrivingLicenceQualifications或其他的表:如果一个许可证可以具有许多资格,并且如果您希望将来添加新资格,那么这将更加灵活。

    FYI,MSSQL中没有布尔数据类型,也许你的意思是BIT?