1) 不能在 DELETE SET NULL 或 ON DELETE CASCADE 上创建外键 2) 不能在 DELETE CASCADE 上创建外键

Posted

技术标签:

【中文标题】1) 不能在 DELETE SET NULL 或 ON DELETE CASCADE 上创建外键 2) 不能在 DELETE CASCADE 上创建外键【英文标题】:1) NOT ABLE to create a foreign keys ON DELETE SET NULL, or ON DELETE CASCADE 2) Not able ON DELETE CASCADE 【发布时间】:2014-02-14 04:21:31 【问题描述】:

我无法在 DELETE CASCADE ON UPDATE CASCADE 上添加外键约束。

我使用两个简单的表格。

TAB1 有 2 列:ID int(10) unsigned NOT NULL AUTOINCREMENT,数据 int(10) unsigned NOT NULL。

TAB2 有 2 列:ID int(10) unsigned NOT NULL AUTOINCREMENT 和 FK int(10) unsigned NOT NULL。

我可以使用“ON DELETE RESTRICT”在 TAB1 的列 ID 上的表 TAB2 的列 FK 中创建外键。

但我无法使用“ON DELETE CASCADE”或“ON DELETE SET NULL”创建这样的密钥。错误是“#1215 - 无法添加外键约束”。

我尝试过有符号、NULL、int(4)...等。不要不明白错误在哪里。


我在一个月前设法用 CASCADE 创建的唯一外键(tcfkowner)在表 tcalendar 添加参考 tuser(tcid)中。

我不明白 DELETE CASCADE 意味着如果我删除用户,日历中指向该用户的行也将被删除。

相反,外键似乎限制了其父级的删除:我无法删除 TABLE tuser 中的任何行,该行由 TABLE tcalendar 中的 FOREIGN KEY(tcfkowner) 指向。错误信息:

" mysql 说:文档

1451 - 无法删除或更新父行:外键约束失败 (gintare_calendar.tcalendar, CONSTRAINT tcalendar_ibfk_1 FOREIGN KEY (tcfkowner) REFERENCES tuser (tcid)) "。

【问题讨论】:

【参考方案1】:

主表和明细表中的两个字段必须相同;先检查一下。

试试这个脚本来创建表并添加外键 -

CREATE TABLE tab1 (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  data int(10) UNSIGNED NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB;

CREATE TABLE tab2 (
  id int(10) UNSIGNED NOT NULL,
  fk int(10) UNSIGNED NOT NULL
)
ENGINE = INNODB;

ALTER TABLE tab2
  ADD CONSTRAINT FK_tab2_tab1_id FOREIGN KEY (fk)
    REFERENCES tab1(id) ON DELETE CASCADE ON UPDATE RESTRICT;

或者试试这个 -

CREATE TABLE tab1 (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  data int(10) UNSIGNED NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB;

CREATE TABLE tab2 (
  id int(10) UNSIGNED NOT NULL,
  fk int(10) UNSIGNED NOT NULL,
  CONSTRAINT FK_tab2_tab1_id FOREIGN KEY (fk)
  REFERENCES tab1 (id) ON DELETE CASCADE ON UPDATE RESTRICT
)
ENGINE = INNODB;

【讨论】:

非常感谢。复制和粘贴已经成功,表创建成功,我只需将主键添加到第二个表。但行动不起作用。例如,我需要在 DELETE SET NULL 上。我使用此操作而不是 CASCADE 创建表。但是当我删除TAB1中的行,而不是在TAB2中相应的外键字段中变为0,它也在TAB2中被删除。 如果我删除外键。之后,我无法使用 On DELETE CASCADE 在同一行上创建外键。我只能在 DELETE RESTRICT 上创建外键。是什么原因? 我无法使用 ON DELETE SET BULL 操作创建表。我在上面使用了您的示例并创建了另外两个表 tab3,tab4 将主键添加到第二个并将行为更改为“ ON DELETE SET NU ”。 ALTER TABLE 语句给出错误“#1005 - Can't create table 'gintare_temp1.#sql-1fee_bc5197' (errno: 150)”如果我尝试 ON DELETE CASCADE - 它可以工作。为什么我不能设置 NULL? 您可能有 NOT NULL 列,请检查它。此外,在无效的 ALTER TABLE 语句之后,运行 SHOW ENGINE INNODB STATUS 命令,并查看错误详细信息。【参考方案2】:

您不能添加 ON DELETE SET NULL,因为 TAB1 中的设置字段设置为非空。 您可以通过更改级联或设置字段以允许 null 值来解决此问题。 希望对我的英语有所帮助和抱歉

【讨论】:

以上是关于1) 不能在 DELETE SET NULL 或 ON DELETE CASCADE 上创建外键 2) 不能在 DELETE CASCADE 上创建外键的主要内容,如果未能解决你的问题,请参考以下文章

级联删除与set null

Set 和 Map 数据结构

为啥实体框架 6 中仍未实现 ON DELETE SET NULL?有障碍吗?

Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL

Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL

在 NULL 指针上调用 delete 或 delete[] [重复]