gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:50:06 25 4
gpt4 key购买 nike

应用程序中的一个标准问题是,如果记录不存在则插入,如果存在则更新。在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com