为空(null)"/>
MySql 外键为空(null)
本文通过实例,验证了MySql 外键可以为空(null)。
1.建表
商品表
create table goods(
id int primary key
)ENGINE = INNODB;
订单表
create table orders(
id int,
goodid int ,
foreign key(goodid) references goods(id)
)ENGINE = INNODB;
2.插入数据
订单表中,试图插入不存在的商品时,不符合外键的约束,报错。
mysql> insert into orders values(1,1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`myDB`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`goodid`) REFERENCES `goods` (`id`))
订单表中,插入商品为null时,插入成功。
insert into orders values(1,null);
insert into orders(id) values(2);
查看订单表中的数据。
select * from orders;
3.后记
在测试中,遇到过如下问题:
3.1 外键没有起作用
现象:不符合外键约束的数据,也插入成功。
经过排查,创建的表存储引擎为MyISAM。而MyISAM不支持事务及外键,InnoDB支持事务及外键。
解决方案:将表的存储引擎改为InnoDB。
3.2 创建订单orders表失败
现象:出现错误提示 Can't create table (errno: 150)
该错误产生的原因可能有三种:
- 外键的引用类型不一样,如主键是int外键是char
- 找不到主表中引用的列
- 主键和外键的字符编码不一致,也可能存储引擎不一样
经过排查,我建表失败的原因是:存储引擎不一样。创建goods表时,数据库引擎默认采用了MyISAM。创建orders表时,显式声明了数据库引擎为InnoDB。两表引擎不一致,所以创建orders表失败。
解决方案:有引用约束的两张表,存储引擎必须相同。
更多推荐
MySql 外键为空(null)
发布评论