【问题标题】:SQL Server Constraints Across Tables跨表的 SQL Server 约束
【发布时间】:2010-05-05 20:07:35
【问题描述】:

我有一个带有Apartment 表(具有FloorNumBuildingID 列)和ApartmentBuilding 表(具有NumFloors 列)的SQL Server 数据库。有什么方法可以设置约束(使用 SQL Server UI)来检查Apartment.FloorNum 是否大于ApartmentBuilding.NumFloors

我试过了:

FloorNum > ApartmentBuilding.NumFloors

但现在我意识到我必须以某种方式加入 BuildingID 上的列,但我不知道如何在约束范围内做到这一点。

感谢您的帮助!

【问题讨论】:

    标签: sql-server constraints check-constraints


    【解决方案1】:

    您不能使用 CHECK CONSTRAINT 执行此操作,因为它需要来自另一个表的数据。您可以使用INSERT/UPDATE trigger 处理此问题。

    【讨论】:

    • 难怪我不知道该怎么做!感谢您阻止我浪费时间
    【解决方案2】:
    1. 在 ApartmentBuilding 表中,在 (BuildingID, NumFloors) 上添加 UNIQUE 约束
    2. 在 Apartment 表中,添加列 NumFloorsInBuilding
    3. 在 Apartment 表中,在 (BuildingID, NumFloorsInBuilding) 上添加引用 (BuildingID, NumFloors) 的外键。这保证了 NumFloorsInBuilding 始终等于父表中的 NumFloors。
    4. 在 Apartment 表中,添加 CHECK(FloorNum

    【讨论】:

    • 仅仅添加一个外键引用并不会神奇地填充 Apartment 表中的 BuildingID 列。当然 - 如果您手动添加最大值。每个公寓的楼层数,那么 CHECK 约束就是小菜一碟 - 但这不必要地重复了 Building 表中已经存在的信息....
    • 肯定是重复信息,这里没有争论。如果您需要坚如磐石的完整性,这是唯一的方法。如果您可以容忍一些无效数据,请使用触发器。
    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2012-05-07
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多