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

Posted

技术标签:

【中文标题】你可以用“IF”开始一个mysql语句吗?【英文标题】:can you begin a mysql statement with "IF"? 【发布时间】: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')”吗?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

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

    两步,插入,然后更新和变体 “重复密钥更新” 替换

也许还有更多,但大多数都是变体。

使用事务,您的 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 会跳过整个过程。

以上是关于你可以用“IF”开始一个mysql语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 mysql 命令行运行 IF 语句吗? v 5.6

你可以在 ORDER BY 中添加 if 语句吗?

mysq

两个if语句可以平行使用吗

C语言中怎样if语句的单分支选择结构比较三个数的大小并打印出最大数和最小数

mysql中的if语句?