你能用“IF”开始一个mysql语句吗?

时间:2009-07-15 21:57:25

标签: php mysql orm doctrine conditional

我正在尝试在mysql中实现“IF记录EXISTS THEN UPDATE ELSE INSERT”。具体来说,我必须弄清楚如何使用Doctrine ORM来做到这一点。

使用本机MySql的一种解决方案是使用“ON DUPLICATE KEY UPDATE”。遗憾的是,Doctrine不支持这一点。

另一个半解决方案是使用“REPLACE INTO”语法。 Doctrine支持这一点,但REPLACE不会更新记录,而是删除记录并创建一个新记录(使用新的自动增量ID。)因此,如果你像我一样依赖自动增量ID,这是一个糟糕的解决方案。 。

我正在尝试操作的表是INNODB,所以我查看了交易,但我不完全理解相同的规则是否适用于交易内部以及适用于它们之外的交易。

我可以说“IF(INSERT IGNORE INTO table critical_id = $ id)那么退出ELSE(UPDATE表SET field ='new_value')”在一个事务内部吗?

如果我不能说出这样的话,有没有解决这个问题的方法呢?

3 个答案:

答案 0 :(得分:1)

找到一种方法使“ON DUPLICATE KEY UPDATE”工作,或切换到使用两个语句:首先选择SELECT以查找任何现有行,然后根据需要更新或插入。

这几乎是你唯一的选择,除了建立一个存储过程,为你完成上述工作。

答案 1 :(得分:1)

“插入或更新”称为“Upsert”。如果你谷歌“upsert mysql”,你会发现只有很少的解决方案。

  1. 两步,插入,然后更新和变化
  2. “ON DUPLICATE KEY UPDATE”
  3. 更换
  4. 可能还有更多,但大多数都是变体。

    使用事务,您的SQL将如下所示:

        UPDATE xxx SET (x1, x2) = (y1, y2) WHERE id = myid;
        IF found THEN
            RETURN;
        END IF;
        BEGIN
            INSERT INTO xxx (x1, x2) VALUES (y1, y2);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
        --##Do nothing, or you can put this whole sql code
        --##in a LOOP and it will loop over and try update again
        END;
    

    此代码从我的一个postgresql函数中删除。我认为InnoDB不支持这一点,但我可能错了。

答案 2 :(得分:0)

您已经提到过INSERT IGNORE INTO。这不符合你的需求吗?

http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html