MySQL IF语句语法错误

时间:2014-03-03 09:12:31

标签: mysql syntax-error

我有这段代码:

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

2 个答案:

答案 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找不到记录,则不会发生任何事情。