InnoDB mySQL无法设置“ON DELETE SET DEFAULT”。如何设置?

时间:2014-01-06 05:19:01

标签: mysql sql innodb

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

以下是“ON DELETE SET DEFAULT”错误:

ERROR 1005 (HY000): Can't create table 'COMPANY.EMPLOYEE' (errno: 150)

这是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; 

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

3 个答案:

答案 0 :(得分:5)

您不能将ON DELETE SET DEFAULTON UPDATE SET DEFAULT与InnoDB

一起使用
  

<强> InnoDB and FOREIGN KEY Constraints
  虽然MySQL服务器允许SET DEFAULT,但会被拒绝   InnoDB无效。使用此CREATE TABLE和ALTER TABLE语句   InnoDB表不允许使用子句。

如果符合您的需要,您可以尝试ON DELETE SET NULL

  

如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新相同   在级联期间它先前更新过的表,它的作用就像   限制。这意味着您不能使用自引用ON UPDATE   CASCADE或ON UPDATE SET NULL操作。这是为了防止无限   级联更新产生的循环。 自我引用ON DELETE   另一方面,SET NULL是可能的,因为是自参考ON   删除CASCADE。级联操作的嵌套操作可能不会超过15   深度水平

这是 SQLFiddle 演示

答案 1 :(得分:0)

  

删除父表,触发设置默认值   儿童。数据库尝试将子记录设置为其默认值0.但是   父表中没有0记录,触发外键   冲突。

查看关于foreign key constrains的MySQL手册:

  

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

一些想法:

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

“在创建外键约束时,MySQL需要在引用表和引用表上都有一个可用的索引。引用表上的索引是自动创建的,如果一个不存在,而是引用的那个上的索引需要手动创建表(源)。您的表似乎缺失。“

请参阅MySQL Foreign Key Error 1005 errno 150

答案 2 :(得分:0)

只使用SET NULL规则并定义触发器,如果​​从主表中删除了默认值,则会尝试使用异常处理程序设置为默认值