【问题标题】:SqlServer constrain field value dependent on another field valueSql Server 约束字段值依赖于另一个字段值
【发布时间】:2010-09-15 10:47:12
【问题描述】:

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

例如:

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

没有汽车执照你不能驾驶公共汽车,所以如果有人在没有汽车执照的情况下试图给某人公共汽车执照,我希望 DB 抛出一个异常。

【问题讨论】:

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


    【解决方案1】:
    ALTER TABLE dbo.DrivingLicence ADD CONSTRAINT
        NameOfConstraint CHECK (CanDriveBus=0 OR CanDriveCar=1)
    

    【讨论】:

      【解决方案2】:

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

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

      所以你的选择是:

      1. 司机只能拥有一个具有唯一编号的许可证:使用 CHECK 约束
      2. 驱动程序可以拥有多个不同类型和不同编号的许可证:使用触发器
      3. 比这更复杂:使用存储的过程或应用程序代码插入新许可证

      您的帖子建议 1,但有点不清楚。即使是这种情况,您也可以考虑使用第二个表,称为 DrivingLicenceQualifications 或其他:如果一个许可证可以有多个资格,并且如果您希望将来添加新的资格,那么这将更加灵活。

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

      【讨论】:

      • 马丁斯的答案正是我想要的,但感谢您指出我没有考虑过的其他一些事情。
      猜你喜欢
      • 2019-08-27
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2019-03-11
      • 2013-12-26
      • 1970-01-01
      相关资源
      最近更新 更多