mysql> select * from mytable;
+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1 | text | text |
| 2 | text | text |
| 3 | text | text |
+----+------+------+
这是一个解决方案:
mysql> load data local infile 'c.csv' into table mytable (@dummy, col1, col2);
Query OK, 3 rows affected (0.03 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from mytable;
+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1 | text | text |
| 2 | text | text |
| 3 | text | text |
| 4 | foo | bar |
| 5 | baz | bam |
| 6 | blee | bloo |
+----+------+------+
另一种解决方案是使用LOAD DATA [LOCAL] INFILE,但覆盖列列表,以便将自动增量值插入到虚拟变量中:
这是一个演示:
我有一个我调用的文本文件
c.csv
:我想插入到mytable中,但是id的1,2,3已经被占用了。我希望插入 csv 数据,但要给定新的 id。
这是一个解决方案:
它从我的 csv 文件中添加了三行,但
id
每行输入的列被绕道进入虚拟变量,因此这些行必须使用默认值,分配新的自动增量 ID。PS:你需要放下你的欲望,如果 id 的序列中没有间隙。间隙是正常的。您将来可能会删除一些行。您可以尝试插入,但它会回滚或出错。在某些情况下,InnoDB 会通过设计生成非连续的 id 值(有关详细信息,请阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html)。
这是完成任务的一种快速而肮脏的方法:
mysqldump
使用或在 phpMyAdmin 中导出数据INSERT INTO {table}
导出中的字符串以具有正确的表名可能还有其他方法,例如之前的临时方法
TRIGGER
将替换为id
NULL 以便自动增量继续,但上述方法可能是最快的......插入时,将一个大数字(大到足以超过现有 ID)添加到
id
传入行的列。计划 A:加载到临时表中,然后
INSERT .. SELECT id+100000, ... FROM temp
.B计划:
警告:在加载过程中,您不得从其他来源插入表格;它可能会创建一个会发生冲突的 id。