前任程序员留下的坑!!!!
系统维护中遇到一个bug,给学员分配课时,显示分配成功,但是课时确未到账。当遇到问题的时候,首先去查日志,发现sql语句执行成功了。但是课时就是未到账!又去看代码,发现代码并没有什么问题。这个问题纠结了好久!今天无意中去看数据库字段,发现该课时字段的值默认为NULL,于是想到是不是NULL在作祟。于是自己去测试这个问题
语言:PHP
框架:TP5
数据库:MYSQL
SQL语句:原生SQL(有待进一步验证,框架提供的更新数据SQL会不会出现此问题)
表结构如下图:
代码:
打印结果显示为int(0)说明,SQL语句没有执行成功,再去数表里查证是否id为1的num变为2
如下图:
结果发现id为1的num值并没有变成2还是为空,如下图
此时,重新设计该表,将num值设置为不为空,默认为0,再去验证。
再去执行刚才的代码,打印结果显示为int(1),且数据表里id为1的num字段值也变成了2,如下图:
说明:当字段设计为NULL的时候,第一次进行UPDATE数据更新(进行加法运算)时,数据会出现问题,凡是数据字段为int的类型,且经常变动,最好将该字段的值设置为非空默认为0 。(有待进一步验证)但是当我要把数据表的字段改为非空默认为0的时候,又报了一个错误。
这个错误是 当你需要变更表字段为必填非空,此时表中有一条数据且此字段为空,造成冲突引起的。需要先将表中该字段的默认为NULL的值全部改成0,即可。