删除级联时是否有“反向”选项?

2024-01-12

假设我在 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);

如果我删除订单,所有订单项目都将被删除(因为ON DELETE CASCADE on FK_OrderItem_Order约束),但相应的价格(正常价格和折扣价格)将永远保留在数据库中。

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

我可以想到一个完美匹配的触发器,但对于这样简单(且常见)的任务来说太麻烦了。我更愿意在我的约束上指定一些内容(FK_OrderItem_Price and FK_OrderItem_DiscountedPrice)基本上说“这是一对一的关系”,删除父级(Price在本例中是父表)如果删除了子表。


In a nutshell: no. Cascading works only from parent to child1, not the other way around.

有人可能会说,当一些父母失去最后一个孩子时,他们应该被移除,但这根本不是当前 DBMS 的实现方式。

您必须使用触发器来执行此类“特殊”参考操作,或者使用批处理作业(它不必立即发生)。或者将操作隐藏在某种明确执行此操作的 API(存储过程、中间层方法)后面。

也可以看看:订单稳定性 https://stackoverflow.com/a/11930467/533120.


1 In you case, Order and Price both act as parents to OrderItem.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除级联时是否有“反向”选项? 的相关文章

  • 在 WHERE 子句中使用可选参数

    我有一个SP ALTER PROCEDURE dbo sp Compare lst varchar 100 frst varchar 100 NULL passportNo varchar 50 NULL AS SELECT FROM db
  • 查询链接服务器时登录失败

    我正在尝试在 SQL Server 中创建链接服务器 Create the link to server uranium EXEC master dbo sp addlinkedserver server N uranium srvprod
  • 如何使用外连接和分组依据在查询中包含 NULL 值

    我有两个表 其中包含以下示例数据 Table 1 item name item id item desc 1 apple 2 orange 3 banana 4 grape 5 mango Table 2 user items user i
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • JbdcTemplate - 带有动态 SQL 查询的PreparedStatements

    I know jdbcTemplate可以用来创建PreparedStatements如果你这样设置 i e private JdbcTemplate jdbcTemplate String sqlQuery Select from tab
  • 从 bak 文件恢复数据库 sql server 的脚本不起作用

    我有一个空数据库 DB Clients 我想从一个恢复数据库 bak file OldDBClients bak 这是路径 C OldDBClients bak 这是我的脚本 USE master GO RESTORE DATABASE D
  • TSQL:无法对 COUNT(*) 执行聚合函数 AVG 来查找一天中最繁忙的时间

    考虑一个保存日志数据的 SQL Server 表 重要的部分是 CREATE TABLE dbo CustomerLog ID int IDENTITY 1 1 NOT NULL CustID int NOT NULL VisitDate
  • 如何在 SQL Server 2008 中使用 GUID 数据类型?

    我想使用建立一个员工表SQL SERVER 2008 在我的表中 我希望为每个员工提供一个 ID 我听说过GUID我有点明白它是一种数据类型 但我无法使用它 你能告诉我使用它的方法吗 顺便说一句 假设我想要这样的东西 CREATE TABL
  • xQuery LIKE 运算符?

    有没有办法以与 SQL 相同的方式使用 XQuery 执行 LIKE 操作 我不想构造一些 startswith endswith 和 contains 表达式 我想要实现的目标的示例 for x in user where x first
  • 与常规 SQL 查询不同,为什么“linq to sql”查询以 FROM 关键字开头?

    为什么 linq to sql 查询以FROM与常规 SQL 查询不同的关键字 LINQ 模仿Logical Query processing在 SQL 中你有 8 SELECT 9 DISTINCT 11 TOP 1 FROM 2 ON
  • 软删除最佳实践(PHP/MySQL)

    Problem 在处理产品和订单的 Web 应用程序中 我想维护前员工 用户 与他们处理的订单之间的信息和关系 我想维护过时产品和包含这些产品的订单之间的信息和关系 然而 我希望员工能够整理管理界面 例如删除前员工 过时的产品 过时的产品组
  • 使用显式值进行 BigQuery 合并

    据我所知 BigQuery 支持合并两个表 目前 INSERT操作允许将显式值插入表中 例如 INSERT dataset Inventory product quantity VALUES top load washer 10 front
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • 关于 Cassandra 与 MySQL 的一些建议

    几天前我在这里问了一个问题 得到了一些非常好的答案 我正在考虑做一个带有个人资料 个人简介等的facebook风格的网站 并询问我是否应该使用mysql 答案是使用Cassandra 因为好多了 我只是问这是每个人都会建议的 只是我对mys
  • Sql批量复制截断小数

    当我使用批量复制将十进制值从 C DataTable 插入 Sql Server 2005 时 值会被截断而不是四舍五入 DataTable 中的数据类型为 Decimal 数据库中的数据类型为Decimal 19 3 数据表中的值为 1
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si

随机推荐

  • 从 XML 文件获取子节点

    我有一个如下所示的 XML 文件
  • 将多个 csv 文件合并为一个 csv 文件

    我正在尝试将多个 csv 文件合并为一个 并尝试了多种方法 但我很挣扎 我从多个 csv 文件导入数据 当我将它们一起编译成一个 csv 文件时 似乎前几行填充得很好 但随后它开始在行之间随机输入可变数量的空格 并且它永远不会填写完合并的
  • 如何为ant任务创建嵌套元素?

    是否可以为任何 ant 任务创建嵌套元素 例如
  • 解析来自远程网站的 xml 数据

    我想解析来自远程网站的xml数据http services faa gov airport status IAD format xml http services faa gov airport status IAD format xml
  • Visual Studio 2019打开解决方案文件不兼容

    我想我正在使用 Visual Studio 2017 并编写了一个 SSIS 包 现在我安装了Visual Studio 2019 但无法打开解决方案文件 错误 不支持 此版本的 Visual Studio 无法打开 以下项目 项目类型可能
  • Azure Functions 的身份验证

    我花了 24 小时阅读有关如何创建 Azure Functions 的所有内容 并成功将 MVC WebApi 转换为具有多个功能的新 Function App 我的问题是 我没有找到任何关于如何使用它们进行最基本的身份验证的明确文档或教程
  • 为什么没有与 new/delete 系列等价的 realloc?

    正如标题所说 我知道没有与 C 相当的东西realloc in the new delete经营者家族 我已经找到了this https stackoverflow com questions 67225388 implementing c
  • 使用 Tkinter 实现密码对话框

    我正在尝试实现一个获取用户密码的对话框 我已经创建了班级PasswordDiaglog继承自tk Toplevel但这会导致其执行不阻塞父框架的问题 import Tkinter as tk class PasswordDialog tk
  • 启动 TaskHost.exe 失败,尝试运行 Windows Phone 8 应用程序?

    我的 VS 2013 设置已经运行良好几个月了 今天我尝试更新到 Visual Studio 2013 Update 2 RC 就像上次我更新到 Update 1 时一样 安装程序严重失败 并出现大量标有 哈希值不正确 错误的软件包 不幸的
  • 从 PHP 和设置权限在 phpBB3 中创建论坛

    我正在尝试在现有论坛上创建一个新论坛 我可以非常轻松地创建新论坛并从管理控制台查看它 问题是我也需要它向用户显示在前端 这是通过权限完成的 因此 我试图做的是将父论坛 公开的 的权限复制到我创建的论坛 然而 该论坛似乎仍然没有出现在面向公众
  • onActivityResult 的问题

    我正在创建一个应用程序 在应用程序启动时相机会打开拍照 我还在应用程序中实现了 Facebook 登录FB Login http developers facebook com docs howtos androidsdk 3 0 logi
  • 黑莓:选择列表中的项目,返回上一屏幕

    我为我的问题准备了一个非常简短的测试用例 如下 单击按钮时 我想在新屏幕中显示字符串列表 用户选择列表中的一项后 应再次显示上一屏幕 并且按钮标签应设置为所选字符串 我的两个问题是 从菜单内部我不知道如何弹出当前显示的屏幕 如何将所选项目从
  • Terraform - Azure 作为提供商和受限访问帐户

    我想使用 Terraform 在 Azure 上部署一些资源 在 Azure 上 我拥有一个仅对一个资源组 RGName 具有 所有者权限 的帐户 不在订阅级别 在我的 Linux 服务器上 我安装了 az cli 并执行了 az logi
  • +CNMI命令:如何接收通知并保存到SIM卡收到的短信

    我需要收到成功发送的通知 我读了很多并尝试过 我有 GSM 调制解调器中兴K4510Z 我没有收到任何通知或保存到 SIM 卡 在我的测试中 我以为我的SIM卡坏了 所以我尝试AT CMGW将临时消息写入 SIM 卡 它成功并存在 所以最后
  • 仅使用下划线检查是否存在重复的数组对

    我想知道如何检查数组中的重复值对是否作为 javascript 中较大数组的一部分存在 你可以看到有一对重复的 1 2 所以函数应该返回true i e var arr 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1
  • 如何让两个物体碰撞后粘在一起?

    我真的很困惑 我可以成功检测到碰撞 但我无法使参与碰撞的两个物体粘在一起 这是我的联系监听器 world setContactListener listener listener new ContactListener Override p
  • 获取 Android 通知以横幅形式显示

    我相当广泛地研究了各种术语 横幅 弹出 通知类型 但我似乎无法清楚地了解我 认为 的一个非常常见的问题 因此 如果由于缺乏术语而导致我错过了一个非常明显的解决方案 请提出建议 问题是这样的 我希望 Android 通知显示为从屏幕顶部掉落的
  • 如何自动填充 SQLAlchemy 数据库字段? (Flask-SQLAlchemy)

    我有一个简单的用户模型 定义如下 models py from datetime import datetime from myapp import db class User db Model id db Column db Intege
  • 在 Cakephp 中使用 $this->Auth 获取关联模型

    我正在使用 CakePHP 2 0 的集成 Auth 组件 我有以下表格 Users Groups Profiles 我的模型关系如下 User belongsTo Group User hasMany Profiles 登录该站点时 我注
  • 删除级联时是否有“反向”选项?

    假设我在 SQL Server 中有以下数据库 CREATE TABLE Order ID BIGINT IDENTITY 1 1 CONSTRAINT PK Order PRIMARY KEY CLUSTERED ID CREATE TA