何时使用不同的永不拒绝("插入或更新")MySQL语句?

Xeo*_*oss 3 mysql database insert

应用程序中的标准问题是如果记录不存在则插入记录 - 如果记录存在则更新.在PRIMARY KEY未知的情况下,通过发出a 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;
Run Code Online (Sandbox Code Playgroud)

以下是三种方法:

  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);

在什么时候应该使用这些方法?
有人能给出一些正确的使用场景的例子吗?

Fil*_*efp 5

  • 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;