今天在应用程序上处理一些插入/更新查询,并且遇到了我没想到的结果。
查询
我的插入查询看起来与此类似:
PARAMETERS nm TEXT(10), st TEXT(2);
INSERT INTO park(pname, pstate)
VALUES([nm],[st]);
他们的同伴更新是这样的:
PARAMETERS id LONG, nm TEXT(10), st TEXT(2);
UPDATE park
SET
pname = [nm], pstate = [st]
WHERE
ID = [id];
他们正在更新的表与此类似:
park
ID LONG | pname TEXT(10) | pstate TEXT(2)
意外结果
通过编写查询,我通过对数据库运行它并为各种参数提供测试值来测试每个查询。在插入查询之后,我将通过更新新插入的记录来测试更新。
在大多数情况下,表格都是空的,因此更新只会更新单个记录。
然而我在以前填充的表上运行更新时,发现查询试图更新所有记录,而不仅仅是ID正在更新的记录通过参数提供。
问题是为什么??
答案 0 :(得分:5)
<强>问题强>
虽然ID
肯定是park
表中的一个字段,但使用id
作为参数主要是在WHERE
子句中说明以下内容:
WHERE ID = id;
或
WHERE ID = ID;
由于ID
总是等于自身,UPDATE
尝试更新所有记录,而不是仅使用提供的ID更新预期记录
<强>解决方案强>
要解决这个问题,我只是在id
之前使用正在更新的表的第一个和最后一个字母来更新由ID
标识的每个案例。因此,工作代码 - 仅更新已识别的记录 - 是:
PARAMETERS pkid LONG, nm TEXT(10), st TEXT(2);
UPDATE park
SET
pname = [nm], pstate = [st]
WHERE
ID = [pkid];
显然,当我编写查询时,我没有密切关注 - 虽然我为其他参数使用了不同的名称,但是当更新查询的ID
时我没有这样做
底线
每当使用参数化查询时,请确保参数名称不要与表格的字段名称匹配。
这样做可以避免上述问题以及其他相关问题。
您还需要避免使用表,字段和参数名称的保留字。
希望这可以帮助有人在更新记录时避免可能令人讨厌的意外 - 或者试图弄清楚为什么他们的参数查询似乎不起作用。