MySql error 1005

本文介绍了一种在MySQL数据库中遇到的外键约束错误及其解决方法。通过调整外键名称,成功解决了Can't create table (errno: 150)的问题。

今天用到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 错误日志是用于记录 MySQL 服务器在运行过程中遇到的错误、警告和重要信息的日志文件。了解错误日志的位置和配置方法对于排查数据库问题至关重要。 ### MySQL 错误日志位置 MySQL 错误日志的默认位置取决于操作系统和安装方式。在大多数 Linux 系统中,默认路径通常位于 `/var/log/mysql/` 或 `/var/log/mysqld.log`。可以通过以下方式查找具体的错误日志路径: - 使用 MySQL 命令行工具查询当前错误日志的路径: ```sql SHOW VARIABLES LIKE 'log_error'; ``` - 如果启用了系统日志(syslog),MySQL 错误信息可能会被记录到系统日志中,而不是单独的错误日志文件中。可以通过以下命令查看: ```sql SHOW VARIABLES LIKE 'log_syslog'; ``` ### 配置 MySQL 错误日志 错误日志的路径和行为可以通过 MySQL 配置文件(通常是 `my.cnf` 或 `my.ini`)中的参数进行配置。主要涉及的参数如下: - `log_error`:指定错误日志文件的路径。例如: ```ini [mysqld] log_error = /var/log/mysql/error.log ``` - `log_warnings`:控制是否将警告信息也记录到错误日志中。此参数在较新版本中已被弃用,取而代之的是 `log_level` 参数。 - `log_error_services`:用于定义哪些类型的日志信息应该写入错误日志。例如,可以配置为记录所有错误、警告和通知: ```ini [mysqld] log_error_services = 'log_filter_internal; log_sink_file' ``` - `log_error_verbosity`:控制错误日志的详细程度。值为 1 表示只记录错误,值为 2 表示记录错误和警告,值为 3 表示记录错误、警告和通知。例如: ```ini [mysqld] log_error_verbosity = 2 ``` ### 示例:修改 MySQL 错误日志路径 假设需要将错误日志从默认路径修改为 `/data/logs/mysql/error.log`,则可以按照以下步骤操作: 1. 编辑 MySQL 配置文件 `my.cnf`: ```ini [mysqld] log_error = /data/logs/mysql/error.log ``` 2. 确保目标目录存在并具有适当的权限: ```bash mkdir -p /data/logs/mysql chown mysql:mysql /data/logs/mysql ``` 3. 重启 MySQL 服务以使配置生效: ```bash systemctl restart mysqld ``` ### 日志文件轮转 为了防止错误日志文件无限增长,建议配置日志轮转工具(如 `logrotate`)。以下是一个简单的 `logrotate` 配置示例: ```bash /data/logs/mysql/error.log { daily missingok rotate 7 compress delaycompress notifempty create 640 mysql mysql } ``` 通过以上配置,错误日志每天会被轮转一次,并保留最近 7 天的日志文件。 ### 总结 MySQL 错误日志是诊断数据库问题的重要工具。通过合理配置 `log_error`、`log_error_verbosity` 和 `log_error_services` 等参数,可以确保错误日志包含足够的信息[^1]。同时,结合日志轮转工具可以有效管理日志文件的大小和生命周期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值