我想在DB中没有记录的情况下执行INSERT

时间:2009-06-25 02:08:24

标签: sql mysql

尝试将上述问题从非母语英语翻译成英语:

这是一个关于在值可能已经存在于数据库中时将值插入数据库时​​使用的最快方法的问题。当值存在时,INSERT将失败,而当值不存在时,UPDATE将失败。哪一种选择最令人满意?

  • 先选择SELECT并选择INSERT或UPDATE。
  • 首先插入INSERT并在出现重复错误时使用UPDATE。

除了上述内容之外还有其他好的选择,请教我。

环境使用MySQL 4.1。

5 个答案:

答案 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语法检查是否有行。