2

我想更新 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;

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

4

3 回答 3

2

还有一个REPLACE

INSERT ON DUPLICATE KEY UPDATEUPDATE当它偶然发现一个重复的键并且不会违反FK's in case on时会触发触发器UPDATE

REPLACE将触发DELETEINSERT触发,并且会违反FK' 引用被REPLACE'd 的行。

如果您没有任何触发器或FK's,则使用INSERT ON DUPLICATE KEY UPDATE,它是最有效的。

您似乎正在寻找此查询:

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

REPLACE除非您在运行查询之前选择了计数器的先前值,否则您无法执行此操作。

PS REPLACE之前出现MySQLON DUPLICATE KEY UPDATE,只是为了兼容性而保留。使用它不会提高性能。

于 2009-02-18T15:32:46.803 回答
1

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

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

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

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

于 2009-02-18T15:27:53.240 回答
-1

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

于 2009-02-18T15:28:29.417 回答