Php 您能否以“mysql”开头;如果“是”的话;?
我试图在mysql中实现“IF record EXISTS THEN UPDATE ELSE INSERT”。具体来说,我必须弄清楚如何使用ORM 使用原生MySql的一个解决方案是使用“重复密钥更新”。不幸的是,这在理论上没有得到支持 另一个半解决方案是使用“REPLACE-INTO”语法。条令支持这一点,但是REPLACE不更新记录,而是删除记录并创建一个新的记录(使用新的自动增量id)。因此,如果像我一样依赖自动增量id,这是一个糟糕的解决方案 我试图操作的表是INNODB,所以我已经研究了事务,但我不完全理解是否在事务内部和外部应用相同的规则 我是否可以在事务内部说“如果(将忽略插入表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,所以我已经研究
关键\u id
=$id),然后退出ELSE(更新表集字段
='new\u value')”
如果我不能这样说,这个问题有什么解决办法吗?您已经提到了插入忽略到。这不符合你的需要吗 找到一种方法使“复制密钥更新”生效,或者切换到使用两条语句:首先选择查找任何现有行,然后根据需要进行更新或插入 这几乎是您唯一的选择,除了构建一个为您完成上述工作的存储过程之外。“插入或更新”称为“Upsert”。如果你在谷歌上搜索“UpsertMySQL”,你会发现只有很少的解决方案
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等价物——一个“内部事务计数器”——来告诉我是否有任何记录被修改。还在看。