在 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】:您可能希望在您的INSERT
s 中使用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 查询,以便在已存在具有相同主键值的记录时将其静默丢弃?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 如何在过程中编写查询? (SET 数据类型参数)
我如何在 codeigniter 中编写这个 MYSQL 语句?