这是一个普遍的问题,我一直在摸索一段时间。我公司的数据库每天处理大约 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。