微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – MySQL偶尔会返回错误的值

这是一个普遍的问题,一个我现在已经摸不着头脑的问题了.我公司的数据库每天处理大约2k行. 99.9%的时间,我们对设置的不同SELECT语句中返回的值没有任何问题.但是,在极少数情况下,我们的数据库将“出现故障”并返回与请求完全不同的行的值.

这是一个非常基本的例子:

+---------+-------------------------+
| row_id  | columnvalue             |
+---------+-------------------------+
|       1 | 10                      |
|       2 | 20                      |
|       3 | 30                      |
|       4 | 40                      |
+---------+-------------------------+

SELECT columnvalue FROM table_name WHERE row_id = 1 LIMIT 1

回报:10

但在非常罕见的情况下,它可能会返回:20或30等.

我完全不知道为什么它有时会这样做,并且会欣赏一些看似编程现象的见解.

更具体的信息:

SELECT
  USERID, CONCAT( LAST, ', ', FirsT ) AS NAME, COMPANYID 
FROM users, companies 
WHERE users.COMPANYCODE = companies.COMPANYCODE 
AND USERID = 9739 LIMIT 1

MysqL> DESCRIBE users;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| USERID     | int(10)     | NO   | PRI | NULL    | auto_increment |
| COMPANYCODE| varchar(255)| NO   | MUL |         |                |
| FirsT      | varchar(255)| NO   | MUL |         |                |
| LAST       | varchar(255)| NO   | MUL |         |                |
+------------+-------------+------+-----+---------+----------------+

MysqL> DESCRIBE companies;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| COMPANYID  | int(10)     | NO   | PRI | NULL    | auto_increment |
| COMPANYCODE| varchar(255)| NO   | MUL |         |                |
| COMPANYNAME| varchar(255)| NO   |     |         |                |
+------------+-------------+------+-----+---------+----------------+

结果假设是:9739,“L —-,E —-”,2197
取而代之的是:9739,“L —-,E —-”,3288

基本上,它根据公司代码的加入返回了错误的公司ID.鉴于我们公司的性质,我不能分享任何更多的信息.

我已经运行了这个查询5k次,并且已经对可想象的代码进行了非常修改,以便生成第二组结果,但我无法复制它.我不是很快责怪MysqL – 这已经发生了(虽然很少)超过8年,并已经用尽所有其他可能的原因.我怀疑在运行查询后手动更改了结果,但是时间戳另有说明.

我只是想知道为什么在500k次中这可以完美地运行499k.

解决方法:

现在我们有一个更现实的查询,我立即注意到您正在加入表,而不是主键,而是公司代码.我们是否确定公司代码被强制执行为公司的唯一索引?如果找到这样的行,限制1将隐藏第二行.

从设计的角度来看,我会在主键上进行连接,以避免重复键的可能性,并将公司代码作为唯一的索引字段进行显示和查找.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐