MySQL “INSERT IGNORE” 和 “INSERT … ON DUPLICATE KEY UPDATE”的区别

MySQL “INSERT IGNORE” 和 “INSERT … ON DUPLICATE KEY UPDATE”的区别

MySQL中的INSERT语句是向表中插入数据的操作,但当插入行时发生冲突(例如插入的行已经存在),则默认情况下MySQL将会抛出错误。为了更好地处理冲突,在INSERT语句中有两种不同的解决冲突的方式:INSERT IGNORE和INSERT … ON DUPLICATE KEY UPDATE。

阅读更多:MySQL 教程

INSERT IGNORE

INSERT IGNORE在遇到冲突的情况下,会忽略冲突并继续插入下一行。例如,下面的SQL语句会将John和Tom插入到students表中。

INSERT INTO students (name, score) VALUES
('John', 87), ('Tom', 95);
SQL

但是如果我们已经有一个名叫John的行

那么当我们尝试插入重复的John行时,MySQL将会返回一个错误。但是如果我们使用INSERT IGNORE语句,那么MySQL将会忽略这个错误并继续插入Tom的行。

INSERT IGNORE INTO students (name, score) VALUES
('John', 87), ('Tom', 95);
SQL

上述SQL语句将插入名为Tom的行,而忽略名为John的行。

INSERT … ON DUPLICATE KEY UPDATE

INSERT … ON DUPLICATE KEY UPDATE会在遇到冲突的情况下更新现有的行。例如,下面的SQL语句会将John的分数更新为90。

INSERT INTO students (name, score) VALUES
('John', 90)
ON DUPLICATE KEY UPDATE score = 90;
SQL

但是如果我们想要插入一个新的行,而不是仅仅更新已有的行,该怎么办呢?我们可以将查询作为子查询,并使用INSERT INTO语句将其结果插入到students表中:

INSERT INTO students (name, score)
SELECT 'Mike', 80 WHERE NOT EXISTS (SELECT * FROM students WHERE name = 'Mike');
SQL

上述SQL语句会将名为Mike的行插入到students表中,但仅当该行不存在时。如果该行已经存在,则不执行任何操作。

总结

INSERT IGNORE和INSERT … ON DUPLICATE KEY UPDATE都可以用于在MySQL中处理插入时的冲突。如果我们想忽略冲突并继续插入下一行,可以使用INSERT IGNORE。如果我们想更新现有的行或插入新的行,可以使用INSERT … ON DUPLICATE KEY UPDATE。这两种方式都是非常有用的,取决于你的需求和应用场景。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程