使用MySQL主键索引与字段排序引出的问题
接手前辈项目在继续开发过程中出现了非常多的问题,有些是因为代码不规范,有些是数据表设计不合理等。在每次解决问题的过程中,我都要压制自己使用砍刀的冲动。还好,不管是大坑、深坑、还是巨坑,最终都被填平。抽空记录下两个后期还可能遇到的问题。
1、MySQL表设置多个主键字段
因为习惯使用Navicat管理数据库,所有在看到某张表有两个主键图标,且还有一个是ID字段,所以没太注意。在一次复制数据时,由于ID字段值重复并且没有报错,所有在后续的操作中一直报错。
通过各种排查才想起来,一张表只能有一个主键字段,所谓的多个主键字段实际上是复合主键。也就是所有标志主键的字段都重复时才会受到主键唯一特性的约束而报错,单一的某个主键字段重复是允许的。
因为其中有ID字段,且从逻辑来看只有ID作为主键就足够使用,所以才会忽略其中的问题,以至于多次查询的结果不尽人意。
2、字符字段做为排序字段
在一次数据排序后取出最大一条数据时,数据最大排序已经到了300多,但是查询出来的数据一直是排序值为99的数据。一开始因为看到该字段全部都是数字,就想当然的默认该字段是整型。 教训是惨痛的,早该想到前辈不会走寻常路,字段设置的居然是varchar类型,多么随意的设定。 幸好当我都快怀疑自己的时候,先怀疑了一下字段设置,果然砍刀是贼亮的!
秉着前辈的代码要少动的原则,轻轻的改动一下:
// 原来排序
$this->where($where)->order('sort DESC')->value('sort');
// 修改成
$this->where($where)->orderRaw("CAST(sort AS UNSIGNED) DESC")->value('sort');
对他人的代码要保持一颗怀疑的心,准没错!