Php 您能否以“mysql”开头;如果“是”的话;?

Php 您能否以“mysql”开头;如果“是”的话;?,php,mysql,orm,doctrine,conditional,Php,Mysql,Orm,Doctrine,Conditional,我试图在mysql中实现“IF record EXISTS THEN UPDATE ELSE INSERT”。具体来说,我必须弄清楚如何使用ORM 使用原生MySql的一个解决方案是使用“重复密钥更新”。不幸的是,这在理论上没有得到支持 另一个半解决方案是使用“REPLACE-INTO”语法。条令支持这一点,但是REPLACE不更新记录,而是删除记录并创建一个新的记录(使用新的自动增量id)。因此,如果像我一样依赖自动增量id,这是一个糟糕的解决方案 我试图操作的表是INNODB,所以我已经研究

我试图在mysql中实现“IF record EXISTS THEN UPDATE ELSE INSERT”。具体来说,我必须弄清楚如何使用ORM

使用原生MySql的一个解决方案是使用“重复密钥更新”。不幸的是,这在理论上没有得到支持

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

我试图操作的表是INNODB,所以我已经研究了事务,但我不完全理解是否在事务内部和外部应用相同的规则

我是否可以在事务内部说“如果(将忽略插入表
关键\u id
=$id),然后退出ELSE(更新表集
字段
='new\u value')”


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

您已经提到了插入忽略到。这不符合你的需要吗

找到一种方法使“复制密钥更新”生效,或者切换到使用两条语句:首先选择查找任何现有行,然后根据需要进行更新或插入

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

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

  • 两步,插入,然后更新和更改
  • “关于重复密钥更新”
  • 替换
  • 也许没有更多,但大部分都是变体

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

    如果记录已经存在,我希望更新它。除非我弄错了,否则INSERT IGNORE只会跳过整个过程。我找到了一种使用“ON replicate KEY”的方法,我认为这是最好的解决方案,所以我会接受这个答案,但我仍在试图找出是否有一种没有mysql特定术语的事务解决方案。fwiw,标题中提出的问题从未得到回答。我认为答案是不能用IF开始SELECT、INSERT、UPDATE语句。我听说在其他dbms中存在一个名为Recordcount的属性。我一直在寻找一个mysql等价物——一个“内部事务计数器”——来告诉我是否有任何记录被修改。还在看。