如何在不增加重复项的 auto_increment 列的情况下进行批量 mysql 插入?

New*_*ang 5 mysql sql mysql-5.5

这是我的数据库架构

+------------------+------------------+------+-----+---------------------+----------------+
| Field            | Type             | Null | Key | Default             | Extra          |
+------------------+------------------+------+-----+---------------------+----------------+
| phone_number     | varchar(64)      | NO   | UNI | NULL                |                |
| id               | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
+------------------+------------------+------+-----+---------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

我希望能够一次插入多个电话号码(phone_number 是唯一键),但如果我有重复项,我不想增加 auto_increment 字段。

如果我这样做INSERT INTO phone_numbers (phone_number) VALUES (%values%) ON DUPLICATE KEY UPDATE id=id;,即使对于重复项,auto_increment 也会增加。

这个问题:防止 MYSQL 重复插入 上的自动增量不处理批量插入。我想做这样的事情:INSERT INTO phone_numbers (phone_number) SELECT '12345', '123456' FROM DUAL WHERE NOT EXISTS( SELECT phone_number FROM phone_numbers WHERE phone_number IN ('12345', '123456');但该DUAL表并不能很好地处理多个值。

有任何想法吗?MySQL 5.5。

And*_*ell 3

阅读另一篇文章后,一种方法是拥有一个可以批量插入的临时表。然后从临时表中选择行到我们的实际表中。此时重复的行将被删除,实际表中的 auto_increment 字段将是正确的。

CREATE TABLE PHONE_NUMBERS (id int(10) NOT NULL AUTO_INCREMENT, phone_number varchar(64), primary key (id), unique(phone_number) );

CREATE TEMPORARY TABLE TMP_PHONE_NUMBERS ( phone_number varchar(64), unique(phone_number) );

' bulk insert
INSERT INTO tmp_phone_numbers (phone_number) VALUES (%values%)

' remove phone numbers that already exist. This will create a unique
' set of phone numbers that do not exist in the real table.
DELETE FROM tmp_phone_numbers WHERE phone_number in (SELECT phone_number from phone_numbers);

' copy into real table
INSERT INTO phone_numbers (phone_number) SELECT phone_number FROM tmp_phone_numbers;

' Temp table is dropped when your connection is closed.
Run Code Online (Sandbox Code Playgroud)

这是另一种选择:

如果您知道在第一次批量加载或任何后续批量加载中不会命中 int(10),则可以使用INSERT INTO phone_numbers (phone_number) VALUES (%values%) ON DUPLICATE KEY UPDATE id=id;这将在 id 字段中留下间隙。但完成批量加载后,您可以删除 ID 列,然后将其重新添加回来,这将重新创建所有 ID,没有间隙。