DBeaver导入CSV无法自动生成自增主键APid,报错求助
解决DBeaver导入CSV时自动生成自增主键的问题
1. 先确认数据库端的自增配置是否正常
首先得保证APid列确实是自增类型,不然跳过列也没用:
- MySQL:执行
SHOW COLUMNS FROM your_table WHERE Field = 'APid';,看Extra列是否显示AUTO_INCREMENT - PostgreSQL:执行
SELECT column_default FROM information_schema.columns WHERE table_name='your_table' AND column_name='APid';,结果应该包含nextval开头的序列配置 - SQL Server:执行
SELECT is_identity FROM sys.columns WHERE name='APid' AND object_id=OBJECT_ID('your_table');,返回1说明是自增列
如果这里配置不对,先去修改表结构,把APid设为自增主键。
2. 修正DBeaver的导入映射设置
大概率是导入时的列映射没设对,按下面步骤调整:
- 进入DBeaver数据导入向导,到**「映射」步骤**
- 找到
APid列:- 将「源列」设置为**<跳过>**(不要关联CSV里的任何列)
- 确认「目标列」是
APid,并且不要勾选「必填」,同时确保DBeaver没有强制给该列传值
- 到最后一步的**「预览SQL」**里检查生成的INSERT语句:正常应该是
INSERT INTO your_table (列1, 列2, ...) VALUES (...),完全不包含APid列。如果语句里出现APid,说明映射没调好,回去重新设置
3. 用原生SQL命令直接导入(绕过图形界面的坑)
如果DBeaver的图形界面还是有问题,直接用数据库原生的导入命令,效率更高且更可靠:
MySQL:
LOAD DATA INFILE '/本地或服务器路径/你的文件.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS -- 跳过CSV表头 (列1, 列2, ...); -- 只写CSV里有的列,不要写APid若要减少对活跃表的影响,可加
CONCURRENT参数(仅InnoDB引擎):LOAD DATA CONCURRENT INFILE ...PostgreSQL:
COPY your_table (列1, 列2, ...) FROM '/本地或服务器路径/你的文件.csv' DELIMITER ',' CSV HEADER; -- HEADER表示跳过表头COPY命令默认是行级锁,对活跃表的阻塞很小
4. 注意活跃表的导入锁机制
因为表正在被API写入,导入时尽量用低阻塞的方式:
- 避免用DBeaver的「逐行插入」,一定要开「批量插入」
- MySQL用
CONCURRENT参数,PostgreSQL用原生COPY,SQL Server用BULK INSERT时加TABLOCK参数(减少锁范围)
内容的提问来源于stack exchange,提问作者Ikthezeus
相关产品推荐
相关产品推荐

