【问题标题】:Check constraints that ensures the values in a column of tableA is less the values in a column of tableB检查确保 tableA 列中的值小于 tableB 列中的值的约束
【发布时间】:2014-01-17 22:42:48
【问题描述】:

我正在创建一个数据库,我有表 ProjectDetails.TimeCardExp 和 ProjectDetails.Project。 TimeCardExp表有一列ExpenseDate,表Project中有一列EndDate; (它们都接受 datetime 数据类型)。我想要做的是对 TimeCardExp 表的 ExpenseDate 列实施约束,以确保在 TimeCardExp 表的 ExpenseDate 列中输入的值小于同一员工的 Project 表的 EndDate 列中的值。

TimeCardExp 表 *TimeCardID*EmployeeID*ProjectID*ExpenseDate

项目表*ProjectID*EmployeeID*EndDate

上面是两张表和一些列,我的任务是确保在 TimeCard.ExpenseDate 中输入的值始终小于同一员工的值 Project.EndDate。谢谢

【问题讨论】:

  • 为此使用触发器。跨表检查约束是有问题的,简单明了。
  • 尝试使用检查但它一直返回错误,因为我对数据库管理系统比较陌生,我有这种感觉我只是没有使用正确的工具,所以我把它拿出来让专家对它的看法和建议,好吗?

标签: sql sql-server database triggers check-constraints


【解决方案1】:

如果可以将您想要避免的条件表达为简单的连接(这里似乎就是这种情况),那么只要您创建一个帮助表,您就可以使用索引视图以声明方式强制执行此操作。

CREATE TABLE dbo.TwoRows
  (
     X INT PRIMARY KEY
  );

INSERT INTO dbo.TwoRows
VALUES      (1), (2)

然后您只需表达不应该发生的条件并将其交叉连接到辅助表。

CREATE VIEW TimeCardExpenseDateLessThanProjectEndDate
WITH SCHEMABINDING
AS
  SELECT P.ProjectID,
         P.EmployeeID,
         P.EndDate,
         TC.ExpenseDate
  FROM   ProjectDetails.Project AS P
         INNER JOIN ProjectDetails.TimeCardExp AS TC
           ON P.ProjectID = TC.ProjectID
              AND P.EmployeeID = TC.EmployeeID
              AND P.EndDate <= TC.ExpenseDate
         CROSS JOIN dbo.TwoRows

GO

CREATE UNIQUE CLUSTERED INDEX IX
  ON TimeCardExpenseDateLessThanProjectEndDate(ProjectID, 
                                               EmployeeID, 
                                               EndDate, 
                                               ExpenseDate) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多