我正在通过对测试人员进行编程来测试我的应用程序(ERP系统),该测试人员将执行30步这样的固定方案
//pseudo code(PHP)
public function runScenario1Test(){
V2_1Tester::resetDatabase();
V2_1Tester::insert60Companies();
V2_1Tester::insert2000Items();
V2_1Tester::insert100Purchases();
V2_1Tester::insert100Sales();
//do some other stuff
V2_1Tester:checkResults();
}
虽然每次我运行相同代码的测试,相同的数据,所有输入都是相同的,但我有时会得到不同的结果!
我的脑袋会爆炸,经过4天的调查,眼泪,甚至是糟糕的数据库梦想,到了晚上,事实证明这个bug在查询中有时会返回不同的结果。就是这样的
+-----+--------------+-----------+------+--------+
| ID | date | direction | col3 | col4 |
+-----+--------------+-----------+------+--------+
| 1 | 2018-03-03 | in | 6 | 100.50 |
| 2 | 2018-03-03 | in | 6 | 350.75 |
+-----+--------------+-----------+------+--------+
-- more ~ 3000 rows
$query = "SELECT * FROM table ORDER BY date, direction, col3";
此查询有时会返回1然后返回2,其他时间则返回2然后返回1。
我通过添加额外的级别来订购ID
来修复查询
$query = "SELECT * FROM table ORDER BY date, direction, col3, ID";
但我不明白为什么MySQL的行为如此?,换句话说,对于所有按行列相同的行,MySQL会遵循哪些规则?为什么会改变?
在SQL中,order by
不稳定。这意味着当键是相同的时,排序可以是任何顺序。
这显然是显而易见的。 SQL表表示无序集。除非列指定了排序,否则没有排序。
所以,你做了正确的事情,包括id
作为最后的关键。这可以确保订单定义明确,因为没有重复的密钥。