【问题标题】:TSQL - How to check a value against a value in a different column before inserting?TSQL - 如何在插入之前根据不同列中的值检查值?
【发布时间】:2009-05-02 02:58:45
【问题描述】:

有没有办法实现一个 CHECK 约束来检查同一个表中不同列中的另一个值的值?具体来说,我想在插入行之前确保要插入的“结帐”日期值大于表中的“签入”日期值。

我可能遗漏了一些细节,所以如果是这种情况,请告诉我。

【问题讨论】:

    标签: sql-server database check-constraints


    【解决方案1】:

    是的,MSSQL Server(和其他)允许CHECK CONSTRAINTS on the table - 这样您就可以比较列:

    ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin
        CHECK (Ckeckout > Checkin)
    

    【讨论】:

      【解决方案2】:

      您可以使用如下检查:

      ALTER TABLE dbo.myTable ADD CONSTRAINT CK_myTable_CheckoutGreaterThanCheckin
      CHECK (dbo.CheckDates()>1)
      

      然后添加如下函数:

      CREATE FUNCTION CheckDates()
      RETURNS int
      AS 
      BEGIN
          DECLARE @retval int
          SET @retval = (SELECT COUNT(*) FROM myTable WHERE checkout > checkin)
          RETURN @retval
      END;
      

      这些可能无法按书面说明工作(抱歉,目前无法访问 SQL 引擎。)

      或者您可能希望在查询中包含检查,这样当检查失败时您就不必在代码中使用错误处理。

      如果您只是希望插入失败,您可以将 where 子句扩展为:

      INSERT INTO myTable (checkout) 
      VALUES(@checkout) 
      WHERE @checkout > @checkin AND IDcolumn = @IDcolumn
      

      如果您想返回某种类型的指示符,表明存在问题,您可以使用类似上面的内容但添加 SELECT @@ROWCOUNT 或者您可以使用提前检查值:

      DECLARE @var int
      SET @var = (SELECT count(*)
      FROM myTable
      WHERE @checkout > checkin AND IDcolumn = @IDcolumn)
      

      如果值通过,@var 将等于 1。

      【讨论】:

      • 支持扩展的 where 子句!比触发器更明显,更易于管理。
      【解决方案3】:

      您可以尝试使用触发器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多