【问题标题】:can you begin a mysql statement with "IF"?你可以用“IF”开始一个mysql语句吗?
【发布时间】:2009-07-15 21:57:24
【问题描述】:

我正在尝试在 mysql 中实现“如果记录存在则更新其他插入”。具体来说,我必须弄清楚如何使用 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 field = 'new_value')”吗?

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

【问题讨论】:

    标签: php mysql orm doctrine conditional


    【解决方案1】:

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

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

    【讨论】:

    • 我找到了一种使用“ON DUPLICATE KEY”的方法,我认为这是最好的解决方案,所以我会接受这个答案,但我仍在试图弄清楚是否有没有交易的解决方案mysql 特定术语。 fwiw,标题中提出的问题从未得到回答。我认为答案是不能用 IF 开始 SELECT、INSERT、UPDATE 语句。我听说在其他 dbms 中存在一个名为 Recordcount 的属性。我一直在寻找一个 mysql 等价物——一个“内部事务计数器”——来告诉我是否有任何记录被修改。还在寻找。
    【解决方案2】:

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

    1. 两步,插入,然后更新和变体
    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 不支持这一点,但我可能错了。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 如果记录已经存在,我希望更新它。除非我弄错了,否则 INSERT IGNORE 会跳过整个过程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2013-02-23
      • 1970-01-01
      • 2013-02-22
      • 2019-12-17
      • 2020-11-09
      • 2021-05-17
      相关资源
      最近更新 更多