SQL Server中表之间的数据完整性



是否可以在SQL Server中的不同表中的列之间添加数据完整性?我有Pay表和Orders表,Pay表的日期为,Orders表的订单日期为。我想添加数据完整性,这样Date就不能早于DateofOrder。当用户在那里插入相同的日期甚至更早的数据库时,就会显示错误。

I认为你的意思是这样的,这里用触发器完成;

CREATE TRIGGER trig_pay ON Pay
FOR INSERT, UPDATE
AS
IF EXISTS(SELECT * 
        FROM [Order] o
        JOIN inserted i
        ON o.id = i.payment_id
        WHERE DateOfOrder>[date])
BEGIN
  RAISERROR ('Sorry, Dave', 16, 1)
  ROLLBACK;
  RETURN;
END
INSERT INTO [Order] values (1, GETDATE());               -- Order today
INSERT INTO Pay values (1, DATEADD(dd, -1, getdate()));  -- Pay yesterday
> Sorry, Dave

是的,您可以使用INSTEAD OF INSERT触发器来完成。

您必须使用INSTEAD OF或AFTER触发器来强制执行此操作,不能以声明方式执行。好吧,你可以用TVF之类的检查约束,但我从来没有尝试过。

我会展示示例代码,但我不确定工资单与订单有什么关系。如果收到新订单,哪个付款日期必须晚于或等于订单日期?是否还有其他列将这两张表联系起来?

这是可能的,而无需求助于触发器。

其想法是将Orders表中的DateofOrder添加到其现有键(我们称之为order_id)中,以创建一个复合超键,然后在Pay表中引用该超键(而不是仅引用简单键order_id)。

以下是基本情况:

CREATE TABLE Orders
(
 order_id CHAR(10) NOT NULL, 
 DateofOrder DATE NOT NULL, 
 UNIQUE (order_id),  -- simple candidate key
 UNIQUE (DateofOrder, order_id)  -- compund superkey
);
CREATE TABLE Pay
(
 order_id CHAR(10) NOT NULL, 
 DateofOrder DATE NOT NULL, 
 FOREIGN KEY (DateofOrder, order_id)
    REFERENCES Orders (DateofOrder, order_id), 
 DateOfPayment DATE NOT NULL,
 CHECK (DateofOrder < DateOfPayment), 
 UNIQUE (order_id)
);

最新更新