加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 是否有“反向”ON DELETE CASCADE选项?

发布时间:2020-12-12 06:59:57 所属栏目:MsSql教程 来源:网络整理
导读:假设我在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_PR
假设我在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,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);

如果我删除订单,将删除所有订单商品(因为FK_OrderItem_Order约束上的ON DELETE CASCADE),但相应的价格(正常和折扣)将永久保留在数据库中.

SQL Server(或通用SQL)中是否有任何选项可以从Price表中删除相应的价格?

我可以想到一个完美匹配的触发器,但对于这样简单(和常见)的任务来说太麻烦了.我宁愿在我的约束(FK_OrderItem_Price和FK_OrderItem_DiscountedPrice)上指定一些基本上说“这是一对一的关系”的东西,删除父项(在这种情况下,Price是一个父表)如果删除了一个孩子.

解决方法

简而言之:不.级联只能从父级到子级1,而不是相反.

可以说有些父母在失去最后一个孩子时应该被移除,但这并不是当前DBMS的实施方式.你必须使用trigger2来进行这种“特殊”参考动作.

话虽这么说,这个模型有点奇怪.价格不应与product3相关联吗?

1在您的情况下,Order和Price都充当OrderItem的父母.

2或批处理作业它不必立即发生.或者隐藏某些API(存储过程,中间层方法)背后的操作,这些API明确地执行此操作.

3关于order stability的担忧尽管如此.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读