-4

我有一个很难解释的 SQL 奇怪错误。无论如何,这似乎很可能是一个 SQL 问题。

我有一个 MYSQL 表,其中包含论坛帖子,并且行中的值以某种方式被其他值覆盖。整行不会被覆盖,如果有人发了新帖子或编辑了帖子,就会发生这种情况。这就是为什么我对此感到困惑。我已经排除了这不可能是编辑他们帖子的人,因为其中一个是我的帖子,并且它被另一条我没有写的消息覆盖了,但是它的标题是我写的。

我确定这不仅仅是人们编辑帖子的另一个原因是我有一个编辑历史表,而这些更改不在该表中。

但是我确实导入了许多帖子,因此它们在表的自动递增索引中导入了 ID。我不确定这是否会导致问题。

这是我自己做的论坛软件,所以不能去问VB,或者其他论坛开发者。

我非常感谢您提供的任何帮助!

4

1 回答 1

1

最可能的嫌疑人是UPDATE具有“错误”谓词的语句。(无论是缺少谓词还是错误的谓词... id_column = wrong_value,或wrong_column = id_value. 也可能是“优先顺序”问题,对OR条件的评估(即缺少括号)。

或者,SET 子句中可能存在问题... SET column = wrong_value,尽管这种类型的问题通常会导致错误列中的行值,而不是错误行中的值。

我建议在行中寻找常见的重复值……这表明 UPDATE 语句更新了不止一行。

另一种可能性是被触发的触发器出现问题。

如果您有多个数据库和多个连接池,那么您的代码是否获得了正确的连接。(也许,关于 UPDATE 语句的所有内容都是正确的,但它是针对错误的数据库执行的……这通常更多是 dev/test/prod 数据库的问题。)

为了调试这一点,规范的做法是启用 MySQL 日志,和/或在应用程序中包含检测以在执行之前记录所有 SQL 语句的文本。

更密集的调试是在表上实现一个 AFTER INSERT 触发器,以捕获所有列的OLD.NEW.值,并将它们记录到另一个审计表中。

再说一次,SQL 可能没有任何问题,可能是错误的变量(或来自不同会话的值?)绑定到 SQL 语句。

导致问题的 SQL 可能是手动运行的,而不是作为应用程序的一部分执行的。(通常,这是我们倾向于看到丢失或错误谓词的地方,它们会更新表中的每一行。)

这些只是一些指针;没有人能够在不查看代码和测试用例的情况下调试您的问题。

于 2013-06-14T22:39:06.713 回答