标签: cascade

为什么我们不能有多个级联路径?

您可以看到许多关于多级联路径的问题。例如:

/sf/ask/59613781/

/sf/ask/424585101/

/sf/ask/1932918221/

但是,从我所看到和理解的情况来看,您可以在许多情况下删除子记录,而不仅仅是删除相关主记录的一种情况。

虽然在一个问题中说 SQL Server 试图通过防止这种情况发生来确保安全,但我真的不明白如果我们有多个级联路径可能会出现什么问题,以及它可以防止哪些问题使其安全

我希望有人能用通俗易懂的语言向我解释这一点,最好使用多个级联路径可能出现问题的示例。

database-design sql-server cascade

13
推荐指数
1
解决办法
5647
查看次数

Postgres 建议“同时截断表......”

运行时:

TRUNCATE TABLE YYYYY RESTART IDENTITY
Run Code Online (Sandbox Code Playgroud)

我看到此错误消息:

ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "XXXXX" references "YYYYY".
HINT:  Truncate table "XXXXX" at the same time, or use TRUNCATE ... CASCADE.
Run Code Online (Sandbox Code Playgroud)

中的两个建议HINT

  1. 使用TRUNCATE ... CASCADE是有意义的,并且有效,但不太明确,因为必须检查YYYYY以查看级联的去向。这让我想尝试另一种选择:

  2. Truncate table "XXXXX" at the same time,但我的问题是:

    截断表是什么意思at the same time


我尝试添加 a TRUNCATE XXXXX...(并将它们都包装在BEGIN/ 中COMMIT),但这会产生相同的错误。

postgresql truncate cascade

11
推荐指数
2
解决办法
9827
查看次数

循环或多个级联路径删除时设置为空:真的吗?

我问这个问题是为了检查我关于级联删除的推理是否正确,以及我是否没有忽略任何东西。我理解这种行为,我不是在问为什么在当前的限制下实施它。

当我们尝试创建一个包含像这样的自引用的表时:

CREATE TABLE [BlogComments] (
    [Id] int NOT NULL IDENTITY,
    [AuthorName] nvarchar(100) NULL,
    [Content] nvarchar(max) NULL,
    [CreatedTime] datetime2 NOT NULL,
    [ReplyToId] int NULL,
    CONSTRAINT [PK_BlogComments] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_BlogComments_BlogComments_ReplyToId] FOREIGN KEY ([ReplyToId])
         REFERENCES [BlogComments] ([Id]) ON DELETE SET NULL -- Not: CASCADE
);
Run Code Online (Sandbox Code Playgroud)

我们得到了臭名昭著的异常

在表 'BlogComments' 上引入 FOREIGN KEY 约束 'FK_BlogComments_BlogComments_ReplyToId' 可能会导致循环或多个级联路径。

我知道该设置ON DELETE SET CASCADE实际上可能会导致删除的递归级联,因此可能很危险,或者充其量是耗时的。但ON DELETE SET NULL不同的是:它只会使ReplyToId直接子记录无效,而不会使它们的子记录无效。

那么我得出的结论是,当外键定义为 SQL Server 时,SQL Server 的限制性太强了ON DELETE SET NULL吗?或者我是否忽略了在这种特殊情况下进行此限制的一些充分理由? …

sql-server cascade

10
推荐指数
1
解决办法
3759
查看次数

DROP TABLE ... CASCADE 不删除任何依赖表

我对 psql 还是比较新的,当我决定尝试删除其他表由于外键关系而依赖的表时,我刚刚完成一项作业。我的期望是,任何对我要删除的表有外键引用的表都会(至少)删除它们的所有行并且该表也被删除。此情况并非如此。这些表仍然存在,即使我指定了CASCADE,这些表的行也没有发生任何变化。

但是TRUNCATE ... CASCADE,在引用的表上使用实际上会删除其他表中的行

编辑: 好的,我理解它这样做是因为这是文档指定的方式,但我现在的问题是,这是什么时候预期的行为?

  • 使用 CASCADE 删除域会删除使用该域的任何表中的每一列。
  • 删除带有附加视图的表将删除该视图。

为什么删除一个被其他表引用的表不会删除引用这个表的表是有意义的?方便吗?

postgresql foreign-key drop-table cascade

7
推荐指数
2
解决办法
2万
查看次数

我可以在包含主键列的复合外键上使用 `on delete set null` 吗?

文件说

限制和级联删除是两个最常见的选项。RESTRICT 防止删除引用的行。NO ACTION 意味着如果检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,则这是默认行为。(这两个选择之间的本质区别是 NO ACTION 允许将检查推迟到事务的后期,而 RESTRICT 不允许。) CASCADE 指定当删除引用的行时,应自动删除引用它的行以及。还有另外两个选项:SET NULL 和 SET DEFAULT。当引用的行被删除时,这些会导致引用行中的引用列分别设置为空值或它们的默认值. 请注意,这些并不能免除您遵守任何约束条件。例如,如果操作指定了 SET DEFAULT 但默认值不满足外键约束,则操作将失败。

但是没有说明on delete set null如果只有一个外键列可以为空,或者如果它只是将可空部分设置为空,是否会失败,是吗?

postgresql foreign-key postgresql-9.3 cascade

5
推荐指数
1
解决办法
2258
查看次数

外键设置为级联但无法更新 - 为什么?

正如其他地方所提到的,我对 SQL 和数据库还很陌生。现在弄脏我的手并尝试所有不同的可能性。

我有一台运行 MySQL 的服务器并设置了下表进行测试:

字段类型归类属性 Null 默认额外
id mediumint(8) UNSIGNED 否 无 AUTO_INCREMENT
域 varchar(255) utf8_unicode_ci 否 无
status enum('...') utf8_unicode_ci 否 无
Replaced_by mediumint(8) UNSIGNED 是 NULL

这个想法是有一个对电子邮件有效的域列表,例如“gmail.com”和“hotmail.com”。现在,如果某个域被识别为与另一个域重复(例如“googlemail.com”到“gmail.com”),则状态列会指示这一点,而“replaced_by”列则为要使用的主域提供 ID。

此外,如果域被识别为无效(例如“gymail.com”而不是“gmail.com”),则数据库可以存储此信息,并且通过 status 和 replace_by 脚本可以建议正确的域。

虽然 ID 是该表的主键,但我想使用 ON DELETE RESTRICT 和 ON UPDATE CASCASE 测试replaced_by 列上的外键。以便replaced_by 列与主ID 保持同步。

但不知何故,当我尝试更新数据时,出现以下错误。为什么?

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`domains`, CONSTRAINT `domains_ibfk_1` FOREIGN KEY (`replaced_by`) REFERENCES `domains` (`id`) ON UPDATE CASCADE)
Run Code Online (Sandbox Code Playgroud)

编辑 - …

mysql foreign-key cascade

5
推荐指数
1
解决办法
3756
查看次数

在 1 个表中更改 ON DELETE CASCADE

我真的很新ON DELETE CASCADE。当父评论在表格中被删除时,如何删除子评论?

表模式

'CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(11) NOT NULL,
  `comment` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=latin1'
Run Code Online (Sandbox Code Playgroud)

当前查询(失败)

ALTER TABLE comments
   ADD CONSTRAINT `delete_child`
   FOREIGN KEY (`parent`)
   REFERENCES `comments` (`id`)
   ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)

错误代码:1452。

'CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(11) NOT NULL,
  `comment` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=latin1'
Run Code Online (Sandbox Code Playgroud)

这个 …

mysql delete mysql-workbench cascade

5
推荐指数
1
解决办法
1629
查看次数

Mysql 中“ON-DELETE-CASCADE”和“ON-DELETE-RESTRICT”约束混合的标准行为

mysql 5.6中,考虑这 2 个在 A、B、C 和 D 之间创建关系的示例。

实施例1

CREATE TABLE `a` (
    id INT UNSIGNED NOT NULL,
    PRIMARY KEY (id)
) ENGINE = INNODB;

CREATE TABLE `b` (
    id INT UNSIGNED NOT NULL,
    a INT UNSIGNED NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (a) REFERENCES a (id) ON DELETE CASCADE
) ENGINE = INNODB;

CREATE TABLE `c` (
    id INT UNSIGNED NOT NULL,
    a INT UNSIGNED NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (a) REFERENCES a (id) …
Run Code Online (Sandbox Code Playgroud)

mysql foreign-key delete sql-standard cascade

5
推荐指数
1
解决办法
593
查看次数

使用 MS SQL Server 上的触发器解决 ON DELETE CASCADE 循环

我的代码在 PostgreSQL 中运行良好,现在必须将其移植到 MS SQL Server。它涉及具有删除/更新事件潜在周期的表,并且 SQL Server 正在抱怨它:

-- TABLE t_parent
CREATE TABLE t_parent (m_id INT IDENTITY PRIMARY KEY NOT NULL, m_name nvarchar(450));

-- TABLE t_child
CREATE TABLE t_child (m_id INT IDENTITY PRIMARY KEY NOT NULL, m_name nvarchar(450),
    id_parent int CONSTRAINT fk_t_child_parent FOREIGN KEY REFERENCES t_parent(m_id)
    --ON DELETE CASCADE ON UPDATE CASCADE
);

-- TABLE t_link
CREATE TABLE t_link (m_id INT IDENTITY PRIMARY KEY NOT NULL,
    id_parent int CONSTRAINT fk_t_link_parent FOREIGN KEY REFERENCES t_parent(m_id)
    -- ON DELETE CASCADE ON …
Run Code Online (Sandbox Code Playgroud)

trigger foreign-key sql-server delete cascade

5
推荐指数
1
解决办法
3351
查看次数

TSQL:如何在不改变表/索引的情况下级联删除

我在不应该插入的表中插入了一些数据。我正在尝试删除数据,但它具有 1:M 关系,我还需要删除引用此数据的数据。

我不想改变表/索引,我只需要这个指令来级联:

-- this alters the CONSTRAINT -- not an option:
ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

此外,我希望(阅读 -更喜欢)不要更改 IDE GUI 设置。

t-sql cascade

4
推荐指数
1
解决办法
1万
查看次数