是否可以在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)
);