- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我的数据库中有一个简单的 User 表和一个以 User.id 作为外键的简单 Item 表:
(id UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
name NVARCHAR (MAX) NULL,
email NVARCHAR (128) NULL,
authenticationId NVARCHAR (128) NULL,
createdAt DATETIME DEFAULT GETDATE() NOT NULL,
PRIMARY KEY (id))
CREATE TABLE Items
(id UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
userId UNIQUEIDENTIFIER NOT NULL,
name NVARCHAR (MAX) NULL,
description NVARCHAR (MAX) NULL,
isPublic BIT DEFAULT 0 NOT NULL,
createdAt DATETIME DEFAULT GETDATE() NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (userId) REFERENCES Users (id))
如果从表中删除用户,我需要先删除所有相关项以避免破坏引用完整性约束。这很容易用 CASCADE DELETE
CREATE TABLE Items
(id UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
userId UNIQUEIDENTIFIER NOT NULL,
name NVARCHAR (MAX) NULL,
description NVARCHAR (MAX) NULL,
isPublic BIT DEFAULT 0 NOT NULL,
createdAt DATETIME DEFAULT GETDATE() NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (userId) REFERENCES Users (id) ON DELETE CASCADE)
但如果我还有引用用户的集合,以及一个将项目收集到集合中的表,我就会遇到麻烦,即以下附加代码不起作用。
CREATE TABLE Collections
(id UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
userId UNIQUEIDENTIFIER NOT NULL,
name NVARCHAR (MAX) NULL,
description NVARCHAR (MAX) NULL,
isPublic BIT DEFAULT 0 NOT NULL,
layoutSettings NVARCHAR (MAX) NULL,
createdAt DATETIME DEFAULT GETDATE() NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (userId) REFERENCES Users (id) ON DELETE CASCADE)
CREATE TABLE CollectedItems
(itemId UNIQUEIDENTIFIER NOT NULL,
collectionId UNIQUEIDENTIFIER NOT NULL,
createdAt DATETIME DEFAULT GETDATE() NOT NULL,
PRIMARY KEY CLUSTERED (itemId, collectionId),
FOREIGN KEY (itemId) REFERENCES Items (id) ON DELETE CASCADE,
FOREIGN KEY (collectionId) REFERENCES Collections (id) ON DELETE CASCADE)
错误表明这“可能导致循环或多个级联路径”。我看到推荐的解决方法是
所以我删除了 ON DELETE CASCADE
和 instead use triggers ( documentation ) 像这样:
CREATE TRIGGER DELETE_User
ON Users
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON
DELETE FROM Items WHERE userId IN (SELECT id FROM DELETED)
DELETE FROM Collections WHERE userId IN (SELECT id FROM DELETED)
DELETE FROM Users WHERE id IN (SELECT id FROM DELETED)
END
CREATE TRIGGER DELETE_Item
ON Items
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON
DELETE FROM CollectedItems WHERE itemId IN (SELECT id FROM DELETED)
DELETE FROM Items WHERE id IN (SELECT id FROM DELETED)
END
CREATE TRIGGER DELETE_Collection
ON Collections
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON
DELETE FROM CollectedItems WHERE collectionId IN (SELECT id FROM DELETED)
DELETE FROM Collections WHERE id IN (SELECT id FROM DELETED)
END
然而,这失败了,尽管很微妙。我有一堆单元测试(用 xUnit 编写)。单独测试总是通过。但是大量运行一些随机失败并出现 SQL 死锁。在 another answer有人向我指出了 SQL Profiler,它显示了两个删除调用之间的死锁。
解决这些菱形删除级联的正确方法是什么?
最佳答案
我更喜欢不有自动级联操作,无论是删除还是更新。只为安心。想象一下,您已经配置了级联删除,然后您的程序由于某些错误而尝试删除错误的用户,即使数据库中有一些与之相关的数据。相关表中的所有相关数据将在没有任何警告的情况下消失。
通常我确保首先使用明确的单独过程删除所有相关数据,每个相关表一个,然后我删除主表中的行。删除将成功,因为引用表中没有子行。
对于你的例子,我有一个专用的存储过程DeleteUser
,带有一个参数UserID
,它知道哪些表与用户相关,以及详细信息应该以什么顺序被删除。此过程已经过测试,是删除用户的唯一方法。如果程序的其余部分错误地尝试直接从 Users
表中删除一行,如果相关表中有一些数据,则此尝试将失败。如果错误删除的用户没有任何详细信息,尝试将通过,但至少您不会丢失大量数据。
对于您的架构,过程可能如下所示:
CREATE PROCEDURE dbo.DeleteUser
@ParamUserID int
AS
BEGIN
SET NOCOUNT ON; SET XACT_ABORT ON;
BEGIN TRANSACTION;
BEGIN TRY
-- Delete from CollectedItems going through Items
DELETE FROM CollectedItems
WHERE CollectedItems.itemId IN
(
SELECT Items.id
FROM Items
WHERE Items.userId = @ParamUserID
);
-- Delete from CollectedItems going through Collections
DELETE FROM CollectedItems
WHERE CollectedItems.collectionId IN
(
SELECT Collections.id
FROM Collections
WHERE Collections.userId = @ParamUserID
);
-- Delete Items
DELETE FROM Items WHERE Items.userId = @ParamUserID;
-- Delete Collections
DELETE FROM Collections WHERE Collections.userId = @ParamUserID;
-- Finally delete the main user
DELETE FROM Users WHERE ID = @ParamUserID;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
...
-- process the error
END CATCH;
END
如果您真的想设置级联删除,那么我会定义一个 触发器,仅用于Users
表。同样,级联删除不会有外键,但 Users
表上的触发器将具有与上述过程非常相似的逻辑。
关于sql - SQL中的级联菱形删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35358238/
我尝试创建菱形 View 。我想在弹出窗口中使用它。有谁知道该怎么做? 感谢任何建议。 最佳答案 看看 PathShape : 看起来您只需将具有正确线条/填充的路径传递给它,然后将其绘制在弹出对话框
我正在努力弄清楚如何添加像此处图片那样的边框。菱形/方形旋转边框。我试过边框图片,但似乎无法加载它们。 这两个 border-image: url('path-to-your-png') 33
当我知道每个 Angular 的度数时,如何使用 css 创建四边形。 我已经尝试通过变换和倾斜重新创建一个四边形。 但是,这并不是很好。 这是我尝试存档的内容。 具体要求是: 以此为背景的一个 di
本人是一名python初学者,刚刚看到一道有趣的python问题,“用python如何在编译器中打印出菱形图案?” 因此决定尝试一下,代码不多,仅供参考。 代码
我是jointJS的新手,我需要使用JointJS创建自定义形状,我尝试使用矩形创建菱形,使其高度和宽度相同,然后旋转45度,如下所示, var diamond = new joint.shapes
我的程序打印出这样的钻石: ...............* ..........* * * .....* * * * * * * * *
我正在使用 SMFL/C++ 制作一个 2D 等距游戏引擎,我在进行等距计算时得到了这个: 这是我在 2D 引擎中计算等距坐标的公式:对于 I-J 坐标,我有: x = (I - J) * (tile
我正在尝试创建一个横跨页面的菱形样式链接菜单。我还会有一些 java 脚本下拉菜单。像这样的东西:\\\\ 我在 div 上使用倾斜 css3 属性,但它们也会倾斜文本,有没有办法取消倾斜 div 中
我想制作一个带有图像背景的菱形。我能做到,唯一的问题是图像似乎同时旋转,这是我不想要的。这也需要在ie8中工作 fiddle :http://jsfiddle.net/zangief007/2bft2
我正在抓取一些韩语文本,大部分字符显示了 99.9%,但其余字符如下所示。 �Z 例如,它应该抓取“고소를해줫어”,但在我的输出中它给了我“고소를해�Z어”。 我知道这是一个编码问题,我只是不知道如何
我正在尝试用 Java 编写一个程序,从用户那里捕获一个整数(假设数据有效),然后根据整数的大小输出一个菱形,即用户输入 5 ,输出将是: --*-- -*-*- *---* -*-*- --*--
我最近将数据库的内容从一台主机移到了另一台主机。在那之后我得到了奇怪的字符,比如两个菱形或菱形,里面有问号而不是瑞典字符 ä。 我之前在第一台主机上遇到过这个问题,然后我添加了这段代码,它工作正常 $
是否可以使用react-native创建菱形 View ? 这是我想要的图片: 我尝试使用边框样式,但无法实现。 最佳答案 我在这里得到了解决方案:https://rnplay.org/apps/58
我正在尝试使用嵌套的 for 循环来显示星号菱形。 这是迄今为止我的代码: public class Diamond { public static void main(String[] ar
我正在做一个元素,我有一个需要响应的 div 钻石图片。 下图显示了我创建的 div 中的钻石,但它不适用于所有尺寸。我希望钻石能够对浏览器大小做出响应,因此它始终适合。 我有a jsFiddle ,
三角形 等腰直角三角形1 2.7 ? 1
我现在正在 ArgoUML 中设计 UML 事件图。 我知道如果我想设计如下条件: if(condition) { doTrueAction(); } else { doFalseAc
我有 2 个 SKSpriteNode: 一个简单的正方形 (A) 旋转(-45°)(B)的同一个正方形 我需要随时检查另一个 SKSpriteNode(一个球)的中心是否在这些方 block 之一内
1.输出上三角形 第一行1个星,第二行3个星,第三行5个星,第四行7个星,第五行9个星。 分析:三角形的形状由输出的空白和星组成,通过分析每一行输出几个空格,几个星,就可完成输出三角形的工作。
我想在 Swift 中创建一个带有 titleLabel 的菱形 UIButton。我的问题是,titleLabel 文本缩小并且仅显示三个点。如何扩展 titleLabel 的框架以获得足够的标题空
我是一名优秀的程序员,十分优秀!