0

我正在尝试在 mysql 中实现“IF 记录存在,然后更新 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) THEN exit ELSE (UPDATE table SET = 'new_value')”吗?field

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

4

3 回答 3

1

要么找到使“ON DUPLICATE KEY UPDATE”工作的方法,要么切换到使用两个语句:首先 SELECT 查找任何现有行,然后根据需要进行 UPDATE 或 INSERT。

这几乎是您唯一的选择,没有构建一个为您完成上述工作的存储过程。

于 2009-07-16T00:49:52.923 回答
1

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

  1. 2 步,插入,然后更新和变体
  2. “重复密钥更新”
  3. 代替

也许还有更多,但其中大部分都是变体。

使用事务,您的 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 不支持这一点,但我可能错了。

于 2009-07-16T01:20:52.043 回答
0

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

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

于 2009-07-15T22:03:05.467 回答