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 上创建外键的主要内容,如果未能解决你的问题,请参考以下文章
为啥实体框架 6 中仍未实现 ON DELETE SET NULL?有障碍吗?
Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL