来自非英语母语为英语的上述问题的尝试翻译:我想要做的INSERT没有记录在数据库
这是插入值时,当值大约最快的方法问题,使用到数据库可能已经在数据库中了。当值存在时,INSERT将失败,否则UPDATE将失败。哪一个选择是最合适的?
- 先做SELECT并选择INSERT或UPDATE。
- 先插入并使用UPDATE,如果它有重复的错误。
如果除了上述之外还有其他不错的选择,请教我。
环境使用MySQL 4.1。
来自非英语母语为英语的上述问题的尝试翻译:我想要做的INSERT没有记录在数据库
这是插入值时,当值大约最快的方法问题,使用到数据库可能已经在数据库中了。当值存在时,INSERT将失败,否则UPDATE将失败。哪一个选择是最合适的?
如果除了上述之外还有其他不错的选择,请教我。
环境使用MySQL 4.1。
如果你想这样做,在一个单独的语句是什么(听起来像你想要什么),我会建议使用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
更新:之前,我得到了一堆更downvotes ...应该指出,这是第一个回复,被编辑和理解问题之前)
老实说这听起来像你。想知道如果记录已经存在该怎么办?或者是新的?
所以你想要做的(伪代码)
$count = SELECT COUNT FROM TABLE WHERE CONDITION;
if($count == 1){
UPDATE...
} else {
INSERT...
}
或者您可以使用IF EXISTS
语法来检查是否有行。
我会建立一个测试数据库和一个脚本来对选项进行基准测试。
只是猜测它,我相信先执行INSERT并重试UPDATE是平均速度更快的方法。这是因为如果数据不在数据库中,那么您保存了另一个查询。如果您的数据更经常地在数据库中,那么先执行UPDATE,如果失败,则使用INSERT重试。
但是,错误可能导致事务中止并需要回滚。如果这对你不好,那么你需要先做一个SELECT。
我不了解MySQL,但我知道在哪里工作,我们在PostgreSQL数据库上使用存储过程来执行此操作。存储过程执行SELECT,然后执行INSERT或UPDATE。
在PHP中,我会首先执行UPDATE,然后使用mysql_affected_rows()检查行是否更新。如果没有,那么我会做一个INSERT。请注意,必须更改mysql_affected_rows()行以返回大于1的结果。
我非常肯定你能。 – scunliffe 2009-06-25 02:10:18
如何在没有此记录的情况下插入记录不在数据库中? – freddiefujiwara 2009-06-25 02:11:55
可以在插入前选择吗? – freddiefujiwara 2009-06-25 02:12:33