尝试将上述问题从非母语英语翻译成英语:
这是一个关于在值可能已经存在于数据库中时将值插入数据库时使用的最快方法的问题。当值存在时,INSERT将失败,而当值不存在时,UPDATE将失败。哪一种选择最令人满意?
除了上述内容之外还有其他好的选择,请教我。
环境使用MySQL 4.1。
答案 0 :(得分:11)
如果你想在一个语句中这样做(听起来像你想要的那样),我建议使用INSERT ... ON DUPLICATE KEY UPDATE
语法,如下所示:
INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom')
ON DUPLICATE KEY UPDATE someothervalue = 'hi mom';
如果没有具有指定键值(主键或唯一键)的现有记录,则将执行初始INSERT
语句。如果记录已存在,则执行以下UPDATE
语句(someothervalue = 3
)。
所有版本的MySQL都支持此功能。有关详细信息,请参阅MySQL Reference Manual page for INSERT ... ON DUPLICATE KEY UPDATE
答案 1 :(得分:0)
更新: 在我收到更多关注之前...应该注意这是在编辑和理解问题之前的第一个回复。)
老实说,如果记录已经存在,您似乎想知道该怎么做?还是新的?
因此你想做什么(伪代码)
$count = SELECT COUNT FROM TABLE WHERE CONDITION;
if($count == 1){
UPDATE...
} else {
INSERT...
}
答案 2 :(得分:0)
我会构建一个测试数据库和一个脚本来对选择进行基准测试。
只是猜测它,我相信首先执行INSERT并且使用UPDATE重试是平均更快的方式。这是因为如果数据不在数据库中,那么您保存了另一个查询。如果您的数据更常出现在数据库中,那么首先执行UPDATE,如果失败则重试INSERT。
但是,错误可能导致事务中止并需要回滚。如果这对你不利,那么你需要先做一个SELECT。
我不知道MySQL,但我知道在我工作的地方,我们在PostgreSQL数据库上使用存储过程来执行此操作。存储过程执行SELECT,然后执行INSERT或UPDATE。
答案 3 :(得分:0)
在PHP中,我会首先执行UPDATE,然后使用mysql_affected_rows()来检查行是否已更新。如果没有,那么我会做一个INSERT。请注意,必须更改mysql_affected_rows()的行才能返回大于1的结果。
答案 4 :(得分:-1)
或者您可以使用IF EXISTS
语法检查是否有行。