我有这段代码:
IF ((SELECT COUNT(*) FROM polje WHERE xkoord = 0 AND ykoord = 0) > 0) THEN
UPDATE polje
SET tezina = tezina + 1
WHERE xkoord = 0 AND ykoord = 0;
它假设检查是否存在具有坐标(0,0)的字段('polje'),如果它存在,则将其权重('tezina')值更新为1.此代码是过程的一部分但是当我选择它并运行该代码时,我得到一个语法错误(就像在过程中一样)。
我做错了什么?
编辑: 这是程序的整个部分:
IF ((SELECT COUNT(*) FROM polje WHERE xkoord = x AND ykoord = y) > 0) THEN
UPDATE polje
SET tezina = tezina + 1
WHERE xkoord = x AND ykoord = y;
ELSE
BEGIN
IF @koncept = 'zid' THEN SET tezina = 9999;
ELSE SET tezina = 1;
END IF;
INSERT INTO polje (xkoord, ykoord, tezina, d_tezina) VALUES (x, y, tezina, tezina);
END;
END IF;
如果数据库中已存在具有这些坐标的字段,那么我将获得'tezina'的NULL值而不是tezina = tezina + 1
答案 0 :(得分:3)
我不完全确定为什么你认为你甚至需要代码的第一部分中的if
语句 - update
完全有能力为你选择记录:
UPDATE polje
SET tezina = tezina + 1
WHERE xkoord = 0 AND ykoord = 0;
这将仅命中两个坐标均为零的行。如果没有,则不会修改任何行。
但是,如果您的目的是检测是否存在行,以便您可以插入或更新它(正如您的编辑似乎建议的那样),正常的方法是使用insert ... on duplicate key ...
。
在您的特定情况下,假设主键是坐标列上的复合词,那么这将是以下几行:
INSERT INTO polje (
xkoord, ykoord, tezina, d_tezina
) VALUES (
x, y, tezina, tezina
) ON DUPLICATE KEY
UPDATE tezina = tezina + 1
另一种可能性是,如果您没有按照这种方式设置主键,则执行更新并检测是否有任何行。如果是这样,你就完成了,否则你需要插入一行。
在这种情况下,update
将与上面显示的第一个相同。然后,您只需检查row_count()
以查看更新的行是否为零。如果是,则插入此坐标对的第一个新行。
请记住,“行更新”的定义取决于您的连接方式。如果使用选项CLIENT_FOUND_ROWS
进行连接,则计数是触及的行数,与当前行值无关(计数与where
子句匹配的行数)。
如果不这样做,您只会将实际已更改的行数计算为新的。
我的意思是,考虑到你有两行:
id value
-- -----
1 A
2 B
然后您运行update tbl set value = 'A'
第一次运行时没有CLIENT_FOUND_ROWS
,行数将设置为1,因为只更新了id 2
。如果再次运行它,则行数将为零,因为没有更新行。
使用 CLIENT_FOUND_ROWS
,无论您运行多少次,都会获得两次行数,因为它会为您提供与where
子句匹配的行
另请注意,update/detect/insert
应在交易中完成,以确保没有竞争条件。
答案 1 :(得分:2)
只需使用更新条款:
UPDATE polje
SET tezina = tezina + 1
WHERE xkoord = 0 AND ykoord = 0
如果xkoord = 0 AND ykoord = 0
找不到记录,则不会发生任何事情。