在MySQL中是否有“更新价值,如果没有这样的行可以插入yyy”?

时间:2009-02-18 15:23:28

标签: mysql sql-update

我想更新Mysql 5上的表值,但是如果该键不存在则创建它。

我发现这样做的方式是:

INSERT yyy ON DUPLICATE KEY UPDATE field;

问题是:上面的格式是否比其他方式效率低(因为插入只会发生一次并且更新会经常发生)?

例如:

$result = UPDATE field; 
if (num_rows_effected($result)==0) INSERT yyy

此外:在Mysql中有更好的方法吗:例如:一种:

UPDATE value IF NO SUCH ROW INSERT yyy;

更新:对于那些建议REPLACE的人,这是我的问题的扩展: “谢谢!我需要增加一个已经存在于表中的计数器(如果存在)。如果没有为该列创建一个值为1的表行。如何用这种格式进行更新(REPLACE)?”

3 个答案:

答案 0 :(得分:2)

还有REPLACE

INSERT ON DUPLICATE KEY UPDATE会触发UPDATE触发器,当它发现重复的密钥时,如果FK上的情况不会违反UPDATE

REPLACE会触发DELETEINSERT触发器,并会违反FK引用REPLACE行的行。

如果您没有任何触发器或FK,那么使用INSERT ON DUPLICATE KEY UPDATE,效率最高。

您似乎在寻找此查询:

INSERT
INTO table (key, counter)
VALUES (@key, 1)
ON DUPLICATE KEY UPDATE
  counter = counter + 1

除非您在运行查询之前选择了计数器的上一个值,否则不能使用REPLACE执行此操作。

P上。 S. {/ em> REPLACE出现在MySQL之前的ON DUPLICATE KEY UPDATE中,仅用于兼容性。使用它没有性能提升。

答案 1 :(得分:1)

是的,您可以使用'替换'语法:

REPLACE INTO table1 (key, col1, col2) values (1, 'val1','val2');

这是MySQL特有的功能,不一定在其他数据库中实现。

至于效率,我的猜测是直接更新会更快,因为MySQL实际上捕获了重复键错误并相应地处理它。但是,除非您进行大量插入/更新,否则性能影响相当小。

答案 2 :(得分:-1)

查看REPLACE命令,它符合您的要求。