我正在尝试创建一个名为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;
请帮帮我!!!并提前致谢:))
答案 0 :(得分:5)
您不能将ON DELETE SET DEFAULT
或ON 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
- 命令。SHOW VARIABLES LIKE 'have_innodb';
- 如果返回YES,则启用InnoDB。“在创建外键约束时,MySQL需要在引用表和引用表上都有一个可用的索引。引用表上的索引是自动创建的,如果一个不存在,而是引用的那个上的索引需要手动创建表(源)。您的表似乎缺失。“
答案 2 :(得分:0)
只使用SET NULL规则并定义触发器,如果从主表中删除了默认值,则会尝试使用异常处理程序设置为默认值