问题标签 [cascade]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - SQL Server DRI (ON DELETE CASCADE) 慢吗?
我一直在分析我们的一个系统中与特别慢的删除操作相关的重复出现的“错误报告”(性能问题)。长话短说:似乎CASCADE DELETE
钥匙在很大程度上是负责任的,我想知道(a)这是否有意义,以及(b)为什么会这样。
我们有一个模式,比如说,小部件,它们位于相关表和相关表的大图的根部,等等。明确地说,不鼓励从该表中删除;这是“核选项”,用户对此并不抱任何幻想。然而,有时不得不这样做。
架构看起来像这样:
列定义如下所示:
没什么太可怕的,真的。AWidget
可以是不同的类型,anAnvil
是特殊类型,因此关系是 1:1(或更准确地说是 1:0..1)。然后是大量数据——随着时间的推移可能收集到数千行数据,涉及硬度、腐蚀、精确AnvilTestData
重量Anvil
、锤子兼容性、可用性问题以及卡通头的冲击测试。
然后每个Widget
人都有各种类型的交易的漫长而无聊的历史 - 生产,库存移动,销售,缺陷调查,RMA,维修,客户投诉等。单个小部件可能有 10-20k 详细信息,或者根本没有,取决于它的年龄。
因此,毫不奇怪,这里的CASCADE DELETE
每个层面都有关系。如果Widget
需要删除一个,则意味着出现了严重错误,我们需要删除该小部件的任何记录,包括其历史记录、测试数据等。再次,核选项。
关系都被索引,统计数据是最新的。普通查询很快。对于除删除之外的所有内容,系统往往会非常顺利地嗡嗡作响。
说到这里,最后,由于各种原因,我们一次只允许删除一个小部件,因此删除语句如下所示:
非常简单,看起来无害的删除...对于没有数据的小部件,运行时间超过 2 分钟!
在苦苦完成执行计划之后,我终于能够挑选出AnvilTestData
和WidgetHistoryDetails
删除作为成本最高的子操作。所以我尝试关闭CASCADE
(但保留实际的 FK,只是将其设置为NO ACTION
)并将脚本重写为非常类似于以下内容:
这两个“优化”都导致了显着的加速,每一个都减少了近一分钟的执行时间,因此原来的 2 分钟删除现在大约需要 5-10 秒 - 至少对于新的小部件来说,没有太多历史记录或测试数据。
为了绝对清楚,仍然有一个CASCADE
from WidgetHistory
to WidgetHistoryDetails
,扇出最高的地方,我只删除了一个 originating from Widgets
。
级联关系的进一步“扁平化”导致了逐渐不那么显着但仍然明显的加速,以至于一旦删除了对较大表的所有级联删除并替换为显式删除,删除新小部件几乎是瞬时的。
我在每次测试之前使用DBCC DROPCLEANBUFFERS
and 。DBCC FREEPROCCACHE
我已经禁用了所有可能导致进一步减速的触发器(尽管这些触发器无论如何都会出现在执行计划中)。而且我也在针对旧的小部件进行测试,并注意到那里也有显着的加速;过去需要 5 分钟的删除现在需要 20-40 秒。
现在我是“SELECT ain't broken”哲学的热心支持者,但对于这种行为似乎没有任何合乎逻辑的解释,除了CASCADE DELETE
关系的粉碎、令人难以置信的低效率。
所以,我的问题是:
这是 SQL Server 中 DRI 的已知问题吗?(我似乎在 Google 或 SO 中找不到任何关于此类事情的参考资料;我怀疑答案是否定的。)
如果没有,我看到的行为是否有另一种解释?
如果这是一个已知问题,为什么会出现问题,我可以使用更好的解决方法吗?
java - 休眠注释级联不起作用
我决定使用休眠将 hbm.xml 样式更改为注释。我的 hbm.xml 中有:
并将其更改为:
用户等级:
休眠.cfg.xml
获取会话的 Java 代码
用于保存许可证对象的 Java 代码
生成的sql:
APPEND_1:工作代码
并且休眠不会节省用户的保存时间。我真的需要帮助!
java - 休眠级联
Hibernate 逆向工程生成的所有东西都是这样的
我想要这种情况:当会话刷新时,首先保存所有构造的子对象,然后是父对象,根据 FK 约束。
当然,需要先保存孩子(自动!),因为有 FK 约束。
你会告诉我:有一个 CASCADE 选项,但是如何将它与 JPA 一起使用?
我尝试像这样添加级联:
对我不起作用。
先告诉我:这个指令应该注释什么以及如何让它工作。
我收到“无法添加或更新子行:外键约束失败”异常。
事实上,我不想手工坚持一切!只构造一个对象并持久化它!
注释什么,使用什么指令以及如何使用?
mysql - 删除级联上的mysql不起作用
我正在尝试在 mysql db 中使用 ON CASCADE DELETE 但我无法使其工作。这是我的代码:
然后我执行插入到某个表中,这将生成一个 UUID。我把这个 UUID 插入到表 p 中。插入 p(testId, phrase, source) values('07616f60-424f-11df-871a-b98e9', 'fun', 'test');
当对 sometable 中的行进行删除时,表 p 中没有任何反应。我错过了什么或我做错了什么
java - Hibernate和级联操作中的1:M关系
表 SUBCOURSE 参考 COURSE COURSE(id, name) SUBCOURSE(id, course_id, name)
所以,1:M。
Hibernate 为 Course 生成:
对于它生成的 Subcourse
现在的问题是级联没有按预期工作。我想创建一个 SubCourse 对象(Set)的集合,填充它然后将其绑定到 Course 对象的 setSubCourse()。然后简单地持久化 Course 对象。
虽然,在 Subcourses 表中有 ManyToOne 的东西,我需要在添加到每个对象的集合之前手动 setCourse() 。如果我不这样做,则在将 Course 对象及其集合持久化时会引发异常。
你能给我推荐什么?
PS或者这可能是游戏的一部分?手动设置每个孩子的父对象?
java - Hibernate - 如何设置空值以便级联工作[有趣!]?
我说的是一个分离的对象,稍后我想用 saveOrUpdate() 更新它。
我们如何同时设置 null 和 clear() 一个引用的集合?
A [1:1] B [1:M] C
B 到 C 的引用可以为空,这意味着没有 C 对 B 的记录。
现在我希望能够同时将 B 设置为 null,以便从数据库中删除所有 C 记录。然后 saveOrUpdate A !
级联设置为全部休眠,包括删除孤儿。
我可以 B.clear(),它将删除 C 中的所有记录。
我可以将 B 设置为 null,这会将 B 设置为 null,但 C 记录不会被删除!(真可惜!确实不方便!)
那么如何?
实际情况很奇怪。
我在 2 个事务中看到了解决方法。First trans:清除一个集合。提交事务。
现在所有的 C 记录都被删除了。
第二笔交易:A.setB(null)。犯罪。这会将一个字段设置为 NULL。
但是如何一步到位呢?
ms-access - 在 Access 2007 中的多个级联下拉框中填充数据
我被分配了在 MS Access 2007 中设计一个临时客户跟踪系统的任务(嘘!)。表和关系都已成功设置。但是我在尝试为一个表设计数据输入表单时遇到了一个小问题……这里先解释一下。
该屏幕包含 3 个下拉框(除其他字段外)。
第一个下拉菜单
第一个下拉列表(cboMarket)表示市场允许用户在 2 个选项之间进行选择:
- 国内的
- 国际的
由于第一个下拉列表仅包含 2 个项目,我没有费心为它制作表格。我将它们添加为预定义的列表项。
第二个下拉菜单
一旦用户在此选项中进行选择,第二个下拉列表(cboLeadCategory)会加载潜在客户类别列表,即展会、代理商、新闻广告、在线广告等。两个市场使用不同的潜在客户类别集. 因此,此框取决于第一个框。
绑定表的结构,名为Lead_Cateogries的第二个组合是:
第三个下拉菜单
根据第二个类别的选择,第三个(cboLeadSource)应该显示一组预定义的属于特定类别的潜在客户来源。
表名为Lead_Sources,结构为:
当我在第一个下拉列表中进行选择时,将调用组合的AfterUpdate事件,它指示第二个下拉列表加载内容:
第二个组合的行源包含一个查询:
第二个组合的更新后事件是:
第三个组合的行源包含:
问题
当我从 cboMarket 中选择市场类型时,第二个组合 cboLeadCategory 会顺利加载适当的类别。
但是当我从中选择一个特定的类别时,而不是加载潜在客户名称的第三个组合,会显示一个模式对话框,要求我输入一个参数。
替代文字 http://img163.imageshack.us/img163/184/enterparamprompt.png
当我在此提示中输入任何内容(有效或无效数据)时,我会得到另一个提示:
替代文字 http://img52.imageshack.us/img52/8065/enterparamprompt2.png
为什么会这样?为什么第三个框没有按需要加载源名称。任何人都可以阐明我哪里出错了吗?
谢谢,m^e
==================================================== =
更新
我在第三个组合的查询中发现了一个故障。它与第二个组合的值不匹配。我修复了它,现在查询位于:
那些讨厌的 Enter Param 提示已经消失了!!!但是,第三个组合仍然顽固地拒绝加载任何值。有任何想法吗?
nhibernate - 当 cascade 是 delete-all-orphan 时,如何在 NHibernate 中更改孩子的父母?
我在双向一对多关系中有两个实体:
和映射:
一个Storage
可以有很多Boxes
,但一个Box
只能属于一个Storage
。我将它们映射,以便一对多具有级联的all-delete-orphan
.
当我尝试更改 Box 的Storage
. 假设我已经运行了这段代码:
以下代码会给我一个例外:
我得到以下异常:
NHibernate.ObjectDeletedException : 已删除的对象将被级联重新保存(从关联中删除已删除的对象)
发生此异常是因为我将级联设置为all-delete-orphan
. 第一个Storage
检测到我Box
从其集合中删除了 并将其标记为删除。但是,当我将它添加到第二个Storage
(在同一个会话中)时,它会尝试再次保存该框并ObjectDeletedException
抛出该框。
我的问题是,如何在不遇到此异常的情况下Box
更改其父级?Storage
我知道一种可能的解决方案是将级联更改为 just all
,但随后我失去了让 NHibernate 自动删除 a 的能力Box
,只需将其从 a 中删除Storage
而不将其与另一个重新关联。或者这是唯一的方法,我必须手动调用Session.Delete
盒子才能删除它?
sql - 将删除级联添加到现有表的 tsql 脚本
是否有可用于对现有表启用级联删除的脚本。谢谢。
mysql - Hibernate 不生成级联
我有一个hibernate.hbm2ddl.auto
要创建的集合,以便 Hibernate 为我在 mysql 中创建表。
但是,hibernate 似乎没有正确添加Cascade
表中的引用。但是,当我删除一行时它确实有效,并且我有一个删除级联作为休眠注释。所以我猜这意味着 Hibernate 在运行时读取注释,并手动执行级联?
这是正常的行为吗?
例如:
在这里,我将级联设置为 ALL。但是,运行时show create table Report
除了外键之外,它没有说任何关于级联的内容。在我看来,它应该添加ON DELETE CASCADE ON DELETE UPDATE