InnoDB mySQL无法设置"ON DELETE SET DEFAULT".如何设置?

Niv*_*ash 4 mysql sql innodb

我正在尝试创建一个名为EMPLOYEE的表.当我使用以下语句时没有"ON DELETE SET DEFAULT"它正在工作.

这是我在"ON DELETE SET DEFAULT"中得到的错误:

ERROR 1005 (HY000): Can't create table 'COMPANY.EMPLOYEE' (errno: 150)
Run Code Online (Sandbox Code Playgroud)

这是DDL

CREATE TABLE EMPLOYEE ( 
    Fname VARCHAR(15) NOT NULL, 
    Minit CHAR, Lname VARCHAR(15) NOT NULL, 
    Ssn CHAR(9) NOT NULL DEFAULT '123456789',
    Bdate DATE, ADDRESS VARCHAR(30), 
    Sex CHAR, Salary DECIMAL(10,2), 
    Super_Ssn CHAR(9) NOT NULL DEFAULT '123456789', 
    Dno INT NOT NULL DEFAULT -99,
    PRIMARY KEY (Ssn), 
    FOREIGN KEY (Super_Ssn) REFERENCES COMPANY.EMPLOYEE(Ssn) 
        ON DELETE SET DEFAULT 
        ON UPDATE CASCADE )ENGINE=InnoDB; 
Run Code Online (Sandbox Code Playgroud)

请帮我!!!并提前谢谢:)

pet*_*erm 5

您不能使用ON DELETE SET DEFAULTON UPDATE SET DEFAULT使用InnoDB

InnoDB和FOREIGN KEY约束
虽然MySQL服务器允许SET DEFAULT,但它被InnoDB拒绝为无效.InnoDB表不允许使用此子句的CREATE TABLE和ALTER TABLE语句.

您可以尝试ON DELETE SET NULL它是否符合您的需求

如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新它在级联期间先前更新的同一个表,它就像RESTRICT一样.这意味着您不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作.这是为了防止级联更新导致的无限循环.另一方面,自引用ON DELETE SET NULL是可能的,就像自引用ON DELETE CASCADE一样.级联操作可能不会嵌套超过15级

这是SQLFiddle演示


Vig*_*r A 0

您删除父表,这会触发子表中设置的默认值。数据库尝试将子记录设置为默认的 0。但是父表中没有 0 记录,从而触发外键违规。

查看有关外键约束的 MySQL 手册:

如果重新创建已删除的表,它必须具有符合引用它的外键约束的定义。如前所述,它必须具有正确的列名称和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL 将返回错误号 1005 并在错误消息中引用错误 150。

一些想法:

  • 最好删除表并使用格式良好的语法创建新表。
  • 确保添加ENGINE=InnoDB;到您的CREATE TABLE- 命令中。
  • 确保您的 MySQL 服务器上启用了 InnoDB。要验证这一点,请尝试以下命令:SHOW VARIABLES LIKE 'have_innodb';- 如果它返回 YES,则 InnoDB 已启用。
  • 检查命令中表名和字段名的大小写。
  • 不仅要检查您要创建的表,还要检查外键引用的表。
  • 确保您引用的表已正确建立索引。

“创建外键约束时,MySQL 要求引用表和被引用表上都有一个可用的索引。如果引用表上的索引不存在,则会自动创建,但引用表上的索引需要创建手动创建(来源)。您的似乎丢失了。”

请参阅MySQL 外键错误 1005 errno 150