我正在尝试创建一个名为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)
请帮我!!!并提前谢谢:)
您不能使用ON DELETE SET DEFAULT或ON 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演示
您删除父表,这会触发子表中设置的默认值。数据库尝试将子记录设置为默认的 0。但是父表中没有 0 记录,从而触发外键违规。
查看有关外键约束的 MySQL 手册:
如果重新创建已删除的表,它必须具有符合引用它的外键约束的定义。如前所述,它必须具有正确的列名称和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL 将返回错误号 1005 并在错误消息中引用错误 150。
一些想法:
ENGINE=InnoDB;到您的CREATE TABLE- 命令中。SHOW VARIABLES LIKE 'have_innodb';- 如果它返回 YES,则 InnoDB 已启用。“创建外键约束时,MySQL 要求引用表和被引用表上都有一个可用的索引。如果引用表上的索引不存在,则会自动创建,但引用表上的索引需要创建手动创建(来源)。您的似乎丢失了。”
| 归档时间: |
|
| 查看次数: |
5840 次 |
| 最近记录: |