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

标签 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 年,并且已经用尽了所有其他可能的原因。我怀疑结果在运行查询后被手动更改,但时间戳另有说明。

我只是摸不着头脑,为什么这可以在 50 万次中完美地运行 49.9 万次。

最佳答案

现在我们有一个更实际的查询,我马上注意到您正在联接表,不是在主键上,而是在公司代码上。我们确定公司代码被强制执行为公司的唯一索引吗?如果找到第二行,Limit 1 将隐藏第二行。

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

关于php - MySQL 偶尔会返回错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18702453/

相关文章:

php - 翻译我主题的 function.php 文件中的自定义标签字段

php - 如何从数据库查询创建多维数组

mysql - 如何将本地 MYSQL 数据库移动到远程数据库服务器

php - 使用 hh :mm:ss countdown without jquery 的 unix 时间戳

mysql - SQL:设计用于存储议程/时间表的表

php - Composer : is there a way to specify a preference order for package repositories?

php - 使用 PHP 为 XML 标记设置命名空间

php - CodeIgniter/PHP Active Record 不会递增整数

php - MYSQL 查询 - 在当前查询中包含我关注的人的帖子

php - 在 PHP 中,如何以 JSON 格式从 MySQL 返回多个列值?