在 MySQL 中,如何编写 INSERT-INTO-VALUES 查询,以便在已存在具有相同主键值的记录时将其静默丢弃?

Posted

技术标签:

【中文标题】在 MySQL 中,如何编写 INSERT-INTO-VALUES 查询,以便在已存在具有相同主键值的记录时将其静默丢弃?【英文标题】:In MySQL, how to write an INSERT-INTO-VALUES query so that it to be silently discarded if a record with same primary key value already exists? 【发布时间】:2010-09-09 03:29:20 【问题描述】:

我必须导入大量可能包含重复的记录。该表是一个具有复合主键且没有外键的 MyISAM 表。如何指定如果插入的记录的主键值组合已经存在于表中,它只会丢弃特定的插入而不抛出错误或插入重复项?

【问题讨论】:

【参考方案1】:

您可能希望在您的INSERTs 中使用IGNORE 关键字:

如果您使用 IGNORE 关键字,则在执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。 (Source)

例子:

CREATE TABLE my_table (
   id int, name varchar(10), value int, PRIMARY KEY (id, name)
);
Query OK, 0 rows affected (0.03 sec)

INSERT IGNORE INTO my_table (id, name, value) VALUES (1, 'a', 100),
                                                     (1, 'b', 200),
                                                     (1, 'b', 300);
Query OK, 2 rows affected (0.00 sec)
Records: 3  Duplicates: 1  Warnings: 0

SELECT * FROM my_table;
+----+------+-------+
| id | name | value |
+----+------+-------+
|  1 | a    |   100 |
|  1 | b    |   200 |
+----+------+-------+
2 rows in set (0.00 sec)

【讨论】:

【参考方案2】:

你需要使用IGNORE关键字:

INSERT IGNORE INTO ...

LOAD DATA INFILE ... IGNORE ...

后者的使用方法详见here。

【讨论】:

以上是关于在 MySQL 中,如何编写 INSERT-INTO-VALUES 查询,以便在已存在具有相同主键值的记录时将其静默丢弃?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.4 中编写 mysql 查询?

MySQL - 如何在过程中编写查询? (SET 数据类型参数)

如何在 MySQL 中编写从现在到今天午夜之间的查询?

我如何在 codeigniter 中编写这个 MYSQL 语句?

如何在 PDO 中使用/编写 mysql_real_escape_string? [复制]

如何在 PostgreSQL 中编写这个 MySQL 位?