【问题标题】:1) NOT ABLE to create a foreign keys ON DELETE SET NULL, or ON DELETE CASCADE 2) Not able ON DELETE CASCADE1) 不能在 DELETE SET NULL 或 ON DELETE CASCADE 上创建外键 2) 不能在 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)) "。

【问题讨论】:

    标签: mysql foreign-keys cascade


    【解决方案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 值来解决此问题。 希望对我的英语有所帮助和抱歉

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多