mysql - 何时使用不同的 never-rejected ("insert or update") MySQL 语句?

标签 mysql database insert

应用程序中的一个标准问题是,如果记录不存在则插入,如果存在则更新。在 PRIMARY KEY 未知的情况下,这通常通过发出 SELECT 然后运行 ​​INSERTUPDATE如果找到记录。

但是,据我所知,似乎至少有三种方法可以将记录插入数据库,即使记录已经存在。就个人而言,如果新的插入请求已经存在,我宁愿删除它,但是在某些情况下,您可能宁愿删除数据库中的记录并使用新的记录。

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;

下面是三种方法:

  1. INSERT IGNORE INTO table (foo, bar) VALUES (2,3);

  2. INSERT INTO table (foo, bar) VALUES (2,3) ON DUPLICATE KEY UPDATE;

  3. 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/

相关文章:

mysql - 如何为 Mac OS X(使用终端)安装 MySQL Connector C++?

Mysql SELECT 在时间限制内只返回列匹配的最近和下一个最近的行

php - php/mysql 中未定义索引的问题

php - INSERT FROM 2 tables 复制表 1 中 1 列中的所有行,仅复制表 3 中 1 列中的最后一行

sql - 使用 Oracle 将树从一个表插入到另一个表的最佳方法是什么

mysql - 通过计数(不同)优化查询

database - 使用 Hibernate 的 Spring Security 3 数据库身份验证

mysql - MySql 数据类型的使用

python - 如何解决django中注释的sql解码错误

Windows 上的 MySQL 连接过多 - 无法刷新主机