这是一个普遍的问题,一个我现在已经摸不着头脑的问题了.我公司的数据库每天处理大约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将隐藏第二行.