有没有办法实现一个 CHECK 约束来检查同一个表中不同列中的另一个值的值?具体来说,我想在插入行之前确保要插入的“结帐”日期值大于表中的“签入”日期值。
我可能遗漏了一些细节,所以如果是这种情况,请告诉我。
有没有办法实现一个 CHECK 约束来检查同一个表中不同列中的另一个值的值?具体来说,我想在插入行之前确保要插入的“结帐”日期值大于表中的“签入”日期值。
我可能遗漏了一些细节,所以如果是这种情况,请告诉我。
是的,MSSQL Server(和其他)允许对表进行 CHECK CONSTRAINTS - 这样您就可以比较列:
ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin
CHECK (Ckeckout > Checkin)
您可以使用以下支票:
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。
您可以尝试使用触发器。