这是一个普遍性问题,我已经摸索了一段时间了。我公司的数据库每天处理大约 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 年,并且已经用尽了所有其他可能的原因。我怀疑结果在运行查询后被手动更改,但时间戳另有说明。
我只是摸不着头脑,为什么这可以在 50 万次中完美地运行 49.9 万次。
最佳答案
现在我们有一个更实际的查询,我马上注意到您正在联接表,不是在主键上,而是在公司代码上。我们确定公司代码被强制执行为公司的唯一索引吗?如果找到第二行,Limit 1 将隐藏第二行。
从设计的角度来看,我会在主键上进行连接以避免重复键的可能性,并将公司代码作为唯一的索引字段放入,仅供显示和查找。
关于php - MySQL 偶尔会返回错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18702453/