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表失败。

    解决方案:有引用约束的两张表,存储引擎必须相同。

 

 

    

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值