关于MySQL的STRICT_TRANS_TABLES
(2011-05-13 21:33:31)
标签:
it |
分类: 工作中-数据库 |
这两天在做一个数据迁移的案子,一个旧的投稿系统要下线了,合并到另一个系统中作为一个模块,涉及到数据的合并操作,因为原来从没接触过类似的操作,这两天可以说是头疼的要命了,尤其是两个系统的表结构完全不一样,中间的转换逻辑很是烦躁。
而今天一下午竟然没点进展,就是因为被困在了一个很初级但是又很隐蔽的问题上。
这次的数据迁移方案因为设计的数据量并不算太大,下线的系统(A)用户表大概5k条,合并的目标系统(B)用户表差不多4w个用户,所以定的方案如下:
1、将两个库先down到本地
2、写一个脚本从A表导出所有数据分表导出到文件中,导出过程不写任何转换逻辑
3、另一个脚本从数据文件中读入数据,每读取一条,做相关表结构转换逻辑,然后插入目标表中
.
.
.
接下来的步骤先不说,就在这第3步的插入操作中,我用的插入语句是从B系统中直接拷过来,然后替换值变量用的,结果出现奇怪的问题,数据插入不成功,打印SQL语句仔细查看没有出现任何错误,将错误报告设置为E_ALL也没有收到任何提示,也许是太过于信任“拷过来”的插入语句,我一直将精力花在自己这边的脚本检查上,花了很多冤枉时间,直到怀疑了,才打印出mysql_error(),收到MySQL
1364错误,说是有必填字段未赋值....
没理由啊,同样的表结构,同样的SQL语句,为何B系统一直以来运行没出现这个问题,而我调试过程中却不能插入呢?
当时估计是头脑发热了,直接把问题定位在MySQL服务的配置上(事实证明我是对的,但是方法太傻,傻到竟然不知道去百度1364错误- -#
汗颜一个,怪天气吧...),打开my.ini,看到可疑的地方:
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
strict这个关键字引起了我的注意,把"STRICT_TRANS_TABLES,"去掉,重启MySQL服务,问题解决……汗颜~~~
经过此役,总结数据库设计中的一个注意点,也即避免此现象的两种方法:
1、在表的设计过程中,对所有不能为空的字段设置默认值
2、配置MySQL服务,如上所述将STRICT_TRANS_TABLES去掉
应该来说还是第一种方法比较好吧,有时候MySQL的配置并不能够随你心改变的,而第一种方法则将入手点放在了自己这边,提倡之。

加载中…