And*_*eyR 8 sql database sql-server database-design
假设我在SQL Server中有以下数据库:
CREATE TABLE [Order]
(
ID BIGINT IDENTITY(1,1)
CONSTRAINT PK_Order PRIMARY KEY CLUSTERED (ID)
);
CREATE TABLE OrderItem
(
ID BIGINT IDENTITY(1,1),
ORDER_ID BIGINT NOT NULL,
PRICE_ID BIGINT NOT NULL,
DISCOUNTED_PRICE_ID BIGINT NULL,
CONSTRAINT PK_OrderItem PRIMARY KEY CLUSTERED (ID)
);
CREATE TABLE Price
(
ID BIGINT IDENTITY(1,1),
AMOUNT FLOAT NOT NULL,
CURRENCY VARCHAR(3) NOT NULL,
CONSTRAINT PK_Price PRIMARY KEY CLUSTERED (ID)
);
ALTER TABLE OrderItem ADD CONSTRAINT FK_OrderItem_Order
FOREIGN KEY (ORDER_ID) REFERENCES [Order](ID) ON DELETE CASCADE;
ALTER TABLE OrderItem ADD CONSTRAINT FK_OrderItem_Price
FOREIGN KEY (PRICE_ID) REFERENCES Price(ID);
ALTER TABLE OrderItem ADD CONSTRAINT FK_OrderItem_DiscountedPrice
FOREIGN KEY (DISCOUNTED_PRICE_ID) REFERENCES Price(ID);
Run Code Online (Sandbox Code Playgroud)
如果我删除一个订单,所有订单项将被删除(因为ON DELETE CASCADE上FK_OrderItem_Order约束),但相应的价格(普通和贴现)将保留在数据库中,直到永远.
SQL Server(或通用SQL)中是否有任何选项可以从Price表中删除相应的价格?
我可以想到一个完美匹配的触发器,但对于这样简单(和常见)的任务来说太麻烦了.我宁愿在我的约束(FK_OrderItem_Price和FK_OrderItem_DiscountedPrice)上指定一些基本上说"这是一对一的关系"的东西,删除父项(Price在这种情况下是父表)如果删除了一个子项.
添加到OrderItemID并Price建立级联删除关系。此列当然是多余的,但它允许您在正确的方向上进行级联删除。
考虑将Price表两次内联到OrderItems. 由于这是 1:1 的关系,因此您可以这样做。无论您是否喜欢这个解决方案,这都是一个品味问题。
您可以创建一个充当反向级联的触发器:
DELIMITER $$
CREATE TRIGGER reverse_cascade_OrderItem_Price
AFTER DELETE ON `OrderItem`
FOR EACH ROW
BEGIN
DELETE FROM `Price` WHERE ID = old.PRICE_ID;
END$$
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3966 次 |
| 最近记录: |