今天用到mysql做数据库服务器,建了几张表,在用到外键的时候数据库总是报出MySQL ERROR 1005: Can't create table (errno: 150)错误,不能建立数据库约束条件。
下面是建立表的脚本:
DROP TABLE IF EXISTS `summertestdb`.`moudle`;
CREATE TABLE `summertestdb`.`moudle` (
`moudleID` varchar(50) NOT NULL,
`moudlename` varchar(50) NOT NULL,
`moudleinfo` varchar(100) DEFAULT NULL,
PRIMARY KEY (`moudleID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `summertestdb`.`role`;
CREATE TABLE `summertestdb`.`role` (
`roleID` varchar(50) NOT NULL,
`rolename` varchar(50) NOT NULL,
`roleinfo` varchar(100) DEFAULT NULL,
PRIMARY KEY (`roleID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `summertestdb`.`userinfo`;
CREATE TABLE `summertestdb`.`userinfo` (
`userID` varchar(50) NOT NULL,
`name` varchar(50) NOT NULL,
`gender` tinyint(1) DEFAULT '1',
`birthday` date NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `summertestdb`.`test`;
CREATE TABLE `summertestdb`.`test` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(50) DEFAULT NULL,
`roleid` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `roleid` (`roleid`),
KEY `userid` (`userid`),
CONSTRAINT `roleid` FOREIGN KEY (`roleid`) REFERENCES `role` (`roleID`) ON DELETE SET NULL ON UPDATE SET NULL,
CONSTRAINT `userid` FOREIGN KEY (`userid`) REFERENCES `userinfo` (`userID`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以上脚本建立的过程都是没有问题的。
之后建立另一个包含外键约束的数据表:
DROP TABLE IF EXISTS `summertestdb`.`moudlerole`;
CREATE TABLE `summertestdb`.`moudlerole` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`moudleid` varchar(50) DEFAULT NULL,
`roleid` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `roleid` (`roleid`),
KEY `moudleid` (`userid`),
CONSTRAINT `roleid` FOREIGN KEY (`moudleid`) REFERENCES `role` (`roleID`) ON DELETE SET NULL ON UPDATE SET NULL,
CONSTRAINT `userid` FOREIGN KEY (`userid`) REFERENCES `userinfo` (`userID`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此时数据库报出MySQL ERROR 1005: Can't create table (errno: 150)错误。一般而言导致这种问题主要有种原因:
1、外键的引用类型不一样,例如主键是int外键是char
2、找不到主表中引用的列
3、主键和外键的字符编码不一致,
但由上面的脚本可以看出这三个问题都不会出现,这也只能是其他原因了。后来为了调试将建立userrole表的脚本修改:
DROP TABLE IF EXISTS `summertestdb`.`test`;
CREATE TABLE `summertestdb`.`test` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(50) DEFAULT NULL,
`roleid` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `roleid` (`roleid`),
KEY `userid` (`userid`),
CONSTRAINT `roleid` FOREIGN KEY (`roleid`) REFERENCES `role` (`roleID`) ON DELETE SET NULL ON UPDATE SET NULL,
CONSTRAINT `userid` FOREIGN KEY (`userid`) REFERENCES `userinfo` (`userID`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
又脚本可以看出,只是修改了表名,其他均为做该表,此时数据库依然报出相同的错误,而将外键约束删除之后则可以顺利执行,由此可见最有可能出现问题的地方就在外键约束之后。那就修改外键名称吧。
DROP TABLE IF EXISTS `summertestdb`.`test`;
CREATE TABLE `summertestdb`.`test` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(50) DEFAULT NULL,
`roleid` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `roleid` (`roleid`),
KEY `userid` (`userid`),
CONSTRAINT `roleid` FOREIGN KEY (`FK1`) REFERENCES `role` (`roleID`) ON DELETE SET NULL ON UPDATE SET NULL,
CONSTRAINT `userid` FOREIGN KEY (`FK2`) REFERENCES `userinfo` (`userID`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这次顺利执行,问题解决。
PS:
时常会在定义Foreign Key的过程中出现 on delete set Null的情况,这个时候如果在数据定义中出现Not null约束条件也会出现这种错误。
分享到:
相关推荐
MySQL Error Code 详细说明
MYSQL安装出现could not start the service mysql error0处理
MYSQL ERROR1405 解决方案 很好用 自己亲测
mysql ERROR 1045 (28000) 错误及其解决办法
环境变量配置错误 mysql 命令行错误 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N
解决Mysql Error-The user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist
在MySQL里创建外键时,提示错误,但只提示很简单的信息:ERROR 1005 (HY000): Can’t create table ‘db_qxztc.qx_userssssnew’ (errno: 150)。根本起不到解决问题的作用。 要看错误的详细提示,可以使用命令:(在...
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决: 1.打开在创建mysql容器时挂载的conf目录下的mysqld.cnf(如下文件) 我创建docker的姿势 2.进入mysqlId.cnf文件中在...
解决MySQL error code 145 Table was marked as crashed and should be repaired的方法
mysql默认是线程不安全的, 及编程时如何解决此问题的解决方案 InnoDB Operating system error number 9. [MDEV-9749] InnoDB receives 'Bad file descriptor' error, possibly related to feedback plugin Lost ...
主要介绍了MySQL ERROR 2013 (HY000)错误解决方法,错误提示全文ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104,需要的朋友可以参考下
MySQL的ERROR 150问题 MySQL的ERROR 150问题 MySQL的ERROR 150问题
Error Code: 2006 - MySQL server has gone away 最终找到原因,原来是MySQL导入大批量数据的时候超出了默认允许最大的数据包所以就提示2006 – MySQL server has gone away 于是找到my.cnf,在[mysqld]加入: max...
Error installing ODBC driver MySQL ODBC5.3 ANSI Driver,ODBC error 13:无法加载 MySQL ODBC5.3 ANSI Driver ODBC驱动程序的安装例程, 因为存在系统错误代码 126:找不到指定的模块。 解决方案:如果电脑是...
php中连接mysql时出现Fatal error Call to undefined function mysql_connect() 解决方法
安装高版本mysql、解决error 2003、error nr.1364 安装高版本mysql、解决error 2003、error nr.1364
主要介绍了MySql Error 1698(28000)问题的解决方法,需要的朋友可以参考下
启动报错:验证加密狗无效 error:1001-mysql参数导致.docx