Mysql 第150号
我正在创建一些简单的表,但我无法通过这个外键错误,我不知道为什么。下面是脚本Mysql 第150号,mysql,foreign-keys,mysql-workbench,Mysql,Foreign Keys,Mysql Workbench,我正在创建一些简单的表,但我无法通过这个外键错误,我不知道为什么。下面是脚本 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, PRIM
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_项目.节”(错误号:150)
我的数据类型似乎相同,语法似乎正确。有人能指出我在这里没有看到什么吗
我正在使用MySQL Workbench 5.2,它在
ON DELETE set default
我以前没有遇到过这种情况,在手册中也没有看到(但现在已经晚了)
更新
刚刚在电视上看到这个
虽然MySQL服务器允许设置默认值,但它被拒绝为
InnoDB无效。使用以下命令创建TABLE和ALTER TABLE语句
InnoDB表不允许使用子句
我猜您可能正在使用InnoDB表?如果您正在使用InnoDB引擎,则删除时的
设置默认值是您的问题。以下是手册的摘录:
虽然MySQL服务器允许设置默认值,但InnoDB将其视为无效而拒绝。InnoDB表不允许使用此子句的CREATE TABLE和ALTER TABLE语句
您可以在删除级联时使用,或在删除集空时使用,但在删除集默认值时不能使用。还有更多信息。如果您在删除时根本没有指定,而是试图从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才能工作。如果您关联不同类型的列,例如源表中的int和目标表中的BigInt,也会发生此错误。这里的问题是数据库引擎(表1MYISAM
和表2engine
)。
要设置外键
- 两个表必须位于同一引擎和同一字符集中
- 父列和FK列中的PK列必须具有相同的数据类型和排序规则类型
希望你有主意。你可以跑步了
SHOW ENGINE INNODB STATUS
以可读格式读取故障原因
e、 g
确保表类型为InnoDB,MyISAM不支持外键,afaik。为了完整性起见-如果对当时未定义的表进行外部引用,也会出现此错误 为了参照另一个表创建一个外键
,两个表中的键应该是主键
,并且具有相同的数据类型
在您的表部分中,主键
属于不同的数据类型,即INT
,但在另一个表中,它属于类型,即VARCHAR
嗨,谢谢你的快速回复。我试着将设置为NULL,但仍然不起作用。我甚至删除了所有的更新/删除行,但仍然给出了错误。我应该指定要使用的特定引擎吗?忽略最后的注释,我已经修复了它。您是对的,我必须将默认值更改为null,但我还必须为每个外键引用创建索引。一旦我做到了,它就成功了@Sixers17-正如您所知,当我在这里尝试您的CREATE TABLE
语句时,我要做的唯一一件事就是将DELETE SET NULL更改为。我不必添加索引。这就是说,不管怎样,在FK上有索引是个好主意,所以一切都很好:)嗯,很有趣,我想知道为什么我的没有索引就不能工作。我注意到你也不能将列设置为notnull
。发现将DELETE RESTRICT
列上的迁移到DELETE SET NULL
列上的。我应该在表声明之后放置Engine=InnoDB吗?或者引用的表没有InnoDB Engine这是我的问题。我使用的是Laravel,我的父列是“增量”列。我不得不将我的引用列更改为未签名整数。这是宝藏!这也有助于诊断其他问题。
------------------------
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.