2009-06-25 40 views
1

来自非英语母语为英语的上述问题的尝试翻译:我想要做的INSERT没有记录在数据库

这是插入值时,当值大约最快的方法问题,使用到数据库可能已经在数据库中了。当值存在时,INSERT将失败,否则UPDATE将失败。哪一个选择是最合适的?

  • 先做SELECT并选择INSERT或UPDATE。
  • 先插入并使用UPDATE,如果它有重复的错误。

如果除了上述之外还有其他不错的选择,请教我。

环境使用MySQL 4.1。

+0

我非常肯定你能。 – scunliffe 2009-06-25 02:10:18

+0

如何在没有此记录的情况下插入记录不在数据库中? – freddiefujiwara 2009-06-25 02:11:55

+0

可以在插入前选择吗? – freddiefujiwara 2009-06-25 02:12:33

回答

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

0

更新:之前,我得到了一堆更downvotes ...应该指出,这是第一个回复,被编辑和理解问题之前)

老实说这听起来像你。想知道如果记录已经存在该怎么办?或者是新的?

所以你想要做的(伪代码)

$count = SELECT COUNT FROM TABLE WHERE CONDITION; 

if($count == 1){ 
    UPDATE... 
} else { 
    INSERT... 
} 
-1

或者您可以使用IF EXISTS语法来检查是否有行。

0

我会建立一个测试数据库和一个脚本来对选项进行基准测试。

只是猜测它,我相信先执行INSERT并重试UPDATE是平均速度更快的方法。这是因为如果数据不在数据库中,那么您保存了另一个查询。如果您的数据更经常地在数据库中,那么先执行UPDATE,如果失败,则使用INSERT重试。

但是,错误可能导致事务中止并需要回滚。如果这对你不好,那么你需要先做一个SELECT。

我不了解MySQL,但我知道在哪里工作,我们在PostgreSQL数据库上使用存储过程来执行此操作。存储过程执行SELECT,然后执行INSERT或UPDATE。

0

在PHP中,我会首先执行UPDATE,然后使用mysql_affected_rows()检查行是否更新。如果没有,那么我会做一个INSERT。请注意,必须更改mysql_affected_rows()行以返回大于1的结果。

相关问题