MySql 外键为空(null)

编程入门 行业动态 更新时间:2024-10-15 02:33:22

MySql 外键<a href=https://www.elefans.com/category/jswz/34/1771092.html style=为空(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)

本文发布于:2024-02-12 19:15:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1689043.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:为空   MySql   null

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!