我创建了几个简单的表格,我无法获得通过该外键的错误,我不知道为什么。 这里是下面的脚本。
create TABLE Instructors (
ID varchar(10),
First_Name varchar(50) NOT NULL,
Last_Name varchar(50) NOT NULL,
PRIMARY KEY (ID)
);
create table Courses (
Course_Code varchar(10),
Title varchar(50) NOT NULL,
PRIMARY KEY (Course_Code)
);
create table Sections (
Index_No int,
Course_Code varchar(10),
Instructor_ID varchar(10),
PRIMARY KEY (Index_No),
FOREIGN KEY (Course_Code) REFERENCES Courses(Course_Code)
ON DELETE cascade
ON UPDATE cascade,
FOREIGN KEY (Instructor_ID) REFERENCES Instructors(ID)
ON DELETE set default
);
错误代码:1005无法创建表“336_project.sections”(错误:150)
我的数据类型相同似乎和语法似乎是正确的。 任何人都可以指出什么,我没有看到吗?
我使用MySQL工作台5.2
如果您使用的是InnoDB引擎, ON DELETE SET DEFAULT
是你的问题。 下面是手动的摘录:
虽然默认设置由MySQL服务器允许的,由InnoDB的为无效被拒绝。 CREATE TABLE和ALTER使用此子句TABLE语句不允许InnoDB表。
您可以使用ON DELETE CASCADE
或ON DELETE SET NULL
,但没有ON DELETE SET DEFAULT
。 还有更多的信息在这里 。
这个错误也,如果你与不同类型的列,如发生。 诠释在目标表中的源表和BigInt有。
您可以运行
SHOW ENGINE INNODB STATUS
读取失败的原因在人类可读的格式
如
------------------------
LATEST FOREIGN KEY ERROR
------------------------
150331 15:51:01 Error in foreign key constraint of table foobar/#sql-413_81:
FOREIGN KEY (`user_id`) REFERENCES `foobar`.`users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE:
You have defined a SET NULL condition though some of the columns are defined as NOT NULL.
这也可能是,如果你不指定的情况下ON DELETE
可言,但试图从InnoDB表引用MyISAM表:
CREATE TABLE `table1`(
`id` INT UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MYISAM CHARACTER SET UTF8;
CREATE TABLE `table2`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`table1_id` INT UNSIGNED NOT NULL,
`some_value` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_table1_id`(`table1_id`),
CONSTRAINT FOREIGN KEY (`table1_id`) REFERENCES `table1`(`id`)
) ENGINE=INNODB CHARACTER SET UTF8;
上述将抛出错误号150。 一个需要改变的第一个表InnoDB的太这个工作。
为了创建一个FOREIGN KEY
参照另一个表,这两个表中的键应该是PRIMARY KEY
并用相同的数据类型。
在你的桌子部分, PRIMARY KEY
是不同的数据类型,即INT
但在另一个表,它的类型,例如VARCHAR
。
这是失败的
ON DELETE set default
我还没有碰到过,以前,我没有看到它在说明书或者(但那么晚)
更新
刚刚看到这个在手册
虽然默认设置由MySQL服务器允许的,由InnoDB的为无效被拒绝。 CREATE TABLE和ALTER使用此子句TABLE语句不允许InnoDB表。
我猜你可能会使用InnoDB表?
这里的问题是数据库引擎(表1 MYISAM
和表2 ENGINE
)。 要设置外键,
- 这两个表必须在相同的发动机和相同的字符集。
- 在父母FK列PK列必须是在相同的数据类型和相同的排序规则类型。
希望你有一个想法。
确保表类型是InnoDB的,MyISAM不支持外键,据我所知。
为了完整起见 - 你也会,如果你让一个外国引用未在时间定义的表得到这个错误;