我想更新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)?”
答案 0 :(得分:2)
还有REPLACE
。
INSERT ON DUPLICATE KEY UPDATE
会触发UPDATE
触发器,当它发现重复的密钥时,如果FK
上的情况不会违反UPDATE
。
REPLACE
会触发DELETE
和INSERT
触发器,并会违反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命令,它符合您的要求。