我试图使用 sql 只更新一行,但我遇到了麻烦。
我正在尝试做这样的事情:
$sql="UPDATE table SET age='$age' WHERE id=(SELECT id FROM another_table WHERE somecondition ORDER BY id LIMIT 1)";
但这并没有更新任何东西。我觉得括号的位置有一些错误,但我不确定它到底出了什么问题。有人知道吗?或者对如何仅更新满足给定条件的一行有其他建议?
编者按:
好吧,我可能把我的问题弄得太复杂了。让我重新表述我的问题;仅更新满足某些条件的 1 行的通用方法是什么。如果行满足条件,则可以是任何行。
您应该首先运行此查询:
SELECT id FROM another_table WHERE somecondition ORDER BY id LIMIT 1
并查看结果,如果您获得特定值,例如1
,请将您的代码更新为
$sql="UPDATE table SET age='$age' WHERE id=(1)";
你可以看到结果。 如果查询未产生错误,则不会考虑您的条件,并且表table
中没有1
ID。
我发现基于子查询中的条件进行更新(如您的示例所示)有时会出现问题,这些问题似乎是由于数据库试图找出最佳执行路径。我发现最好做如下事情,注意到我的代码是T-SQL的,可能需要稍微调整才能在MySQL中工作。
UPDATE T1 SET age=@Age
FROM table as T1 INNER JOIN
another_table as T2 ON T1.id = T2.id
WHERE [use appropriate conditions here]
尝试运行此查询:
UPDATE table t
SET t.age='$age'
WHERE t.id = (SELECT a.id
FROM another_table a
WHERE somecondition
ORDER BY a.id
LIMIT 1
);
此错误的一个不常见的原因是id
列具有不同的名称。 您应该养成限定列名的习惯。 还应验证两个表中的 ID 是否匹配。
另一个原因只是匹配的条件不返回不在表中的行或 ID。 这有点难以修复,可以更好地理解数据和数据结构。