应用程序中的一个标准问题是,如果记录不存在则插入,如果存在则更新。在 PRIMARY KEY
未知的情况下,这通常通过发出 SELECT
然后运行 INSERT
或 UPDATE来解决
如果找到记录。
但是,据我所知,似乎至少有三种方法可以将记录插入数据库,即使记录已经存在。就个人而言,如果新的插入请求已经存在,我宁愿删除它,但是在某些情况下,您可能宁愿删除数据库中的记录并使用新的记录。
CREATE TABLE IF NOT EXISTS `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`foo` int(10) unsigned NOT NULL,
`bar` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `row` (`foo`,`bar`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
下面是三种方法:
INSERT IGNORE INTO table (foo, bar) VALUES (2,3);
INSERT INTO table (foo, bar) VALUES (2,3) ON DUPLICATE KEY UPDATE;
REPLACE INTO table (foo, bar) VALUES (2,3);
应该在什么时候使用这些方法?
谁能举出一些正确使用场景的例子?
最佳答案
INSERT
当你只想插入一个新行时应该使用假设您正在存储日志条目,您需要记录每个事件,请使用
INSERT
.
INSERT IGNORE
当您只想在表中存在特定键时应该使用它,无论是当前插入创建它还是已经存在都没有关系。假设您有一个电话号码表和使用次数表,您发现一个您不确定表中是否存在但您希望它存在的新电话号码。
您使用
INSERT IGNORE
以确保它在那里。
REPLACE INTO
当您想确保表中存在特定键时应该使用,如果它存在您希望使用新值而不是当前值。您有另一个包含电话号码的表格,这次您找到了一个新号码和一个与之相关联的姓名。
您使用
REPLACE INTO
查找并更新完整的记录,或者只是插入新信息。
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
请注意,这不是另一种书写方式
REPLACE INTO
,只要您想确保特定键存在,就应该使用上面的方法,但如果它确实更新了一些列,而不是所有列。例如,如果您正在存储来自某个 IP 的访问次数,以及用户曾经访问过的第一个页面。
INSERT INTO visitors (ip,visits,first_page) VALUES (<ip>,1,<current_page>) ON DUPLICATE KEY visits = visits +1;
关于mysql - 何时使用不同的 never-rejected ("insert or update") MySQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8596169/