MySQL创建外键时报Can't create table (errno: 150)错误解决办法

本文探讨了在数据库中创建外键约束时遇到的问题及原因,主要包括数据类型不匹配、字符编码不一致以及无法在外键引用表中找到对应记录等情况。

总的来说,这个问题的原因就是创建的外键和关联的表的主键类型不匹配。下面用个简单的例子来说明。

两张很简单的表,学生表和教师表:

CREATE TABLE `t_teacher` (
  `id` varchar(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t_student` (
  `id` varchar(11) NOT NULL DEFAULT '',
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


现在需要给学生表创建一个外键来关联教师表:

第一种情况,很简单,就是列的类型不匹配,比如用int类型的列去关联varchar的列:

ALTER TABLE `t_student`
ADD COLUMN `teacher_id`  int(11) NULL AFTER `name`;

ALTER TABLE `t_student` ADD CONSTRAINT `teacher_id_fk` FOREIGN KEY (`teacher_id`) REFERENCES `t_teacher` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

另外一种情况,虽然数据类型一致了,但是字符编码不一致,例如:





最后一种情况则是,找不到外键引用的列。列在增加外键的时候,可能已经存在数据了(历史数据,或者更新数据库表时设置的默认值),但这些数据并不一定能在外键关联表中找到对应的行记录。这种情况也会导致外键创建失败。



提供的引用内容中未提及解决创建表时出现errno150错误的方法。通常,MySQLerrno 150错误一般与约束有关,以下是一些常见的解决思路及示例代码: ### 检查关联表和字段 确保关联的表和字段存在,并且数据类型、字符集和排序规则一致。例如,要创建一个`orders`表,其关联`customers`表的`customer_id`字段: ```sql -- 创建customers表 CREATE TABLE customers ( customer_id INT PRIMARY KEY, customer_name VARCHAR(100) ); -- 创建orders表,关联customers表的customer_id字段 CREATE TABLE orders ( order_id INT PRIMARY KEY, order_date DATE, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); ``` ### 检查表引擎 确保关联的表使用的是支持约束的存储引擎,如InnoDB。可以通过以下语句查看和修改表的存储引擎: ```sql -- 查看表的存储引擎 SHOW CREATE TABLE customers; -- 修改表的存储引擎为InnoDB ALTER TABLE customers ENGINE=InnoDB; ``` ### 检查索引 确保关联的字段上有索引。如果没有索引,创建索引: ```sql -- 为customers表的customer_id字段创建索引 CREATE INDEX idx_customer_id ON customers(customer_id); ``` ### 检查数据完整性 确保关联的字段中没有违反约束的数据。可以通过以下语句删除不符合约束的数据: ```sql -- 删除orders表中customer_id在customers表中不存在的数据 DELETE FROM orders WHERE customer_id NOT IN (SELECT customer_id FROM customers); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值