ERROR 1366 (HY000): Incorrect integer value: ‘‘ for column ‘id‘ at row 1

关于“ERROR 1366 (HY000): Incorrect integer value: ‘语音网关’ for column ‘id’ at row 1”错误解决

首先,排除以下几种可能:
1.确认CSV文件的列顺序和表定义的字段顺序一致,避免字段错位导致数据错误导入;
2.导入命令的参数设置:使用 LOAD DATA INFILE 命令导入数据时,是否正确设置了字段分隔符 (FIELDS TERMINATED BY) 和行分隔符 (LINES TERMINATED BY),以及忽略表头行 (IGNORE 1 LINES)?
3.检查数据库连接字符集:有时字符集或编码问题也可能导致类似的错误,确保数据库连接的字符集设置正确。
4.查看MySQL的错误日志:

less /var/log/mysqld.log

如果觉得日志不多,直接:

cat /var/log/mysqld.log

5.考虑数据内容和字段类型是否匹配:

# python检测,打印每列的数据类型(df是读取的文件)
print(df.dtypes)
#顺带查看以下空缺值
# 查看每列的空缺值数量
print(df.isnull().sum())
# 打印DataFrame中所有的空缺值
print(df[df.isnull().any(axis=1)])

在以上都排除之后,回到代码:

CREATE TABLE DataAdmin (
  id INT AUTO_INCREMENT PRIMARY KEY,
  pro_class VARCHAR(255) NOT NULL,
  .
  .
  .
  unit_price FLOAT NOT NULL
);

这里,导入时使用了数据库的自动增长功能,可以不指定 id 列,让数据库自动为每行数据分配唯一的 id 值。但是,如果在插入时使用了默认的 id 自增列,MySQL 仍然会尝试将第一列“pro_class”的数据插入到这个自增列“id”中。所以可以通过以下方法解决:

方法一:明确指定列名,不依赖于默认顺序或者默认的自增列。
(1)创建一个临时表,用来接收从 CSV 文件导入的数据,灵活地指定列名和数据类型。

CREATE TEMPORARY TABLE temp_DataAdmin (
    pro_class VARCHAR(255),
	...
    unit_price FLOAT
);

(2)使用 LOAD DATA INFILE 导入数据到临时表,导入过程中MySQL 会根据列的顺序自动匹配到临时表的各个列。

LOAD DATA INFILE '/var/lib/mysql-files/Data.csv'
INTO TABLE temp_DataAdmin
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

(3)将数据从临时表 temp_DataAdmin 插入到目标表 DataAdmin 中,并且明确指定目标表的列名。

INSERT INTO DataAdmin (pro_class, ..., unit_price)
SELECT pro_class, ..., unit_price
FROM temp_DataAdmin;
(...省略了其他的列名)

方法二:使用 LOAD DATA INFILE,这个命令可以根据 CSV 文件的列顺序将数据直接加载到数据库中的指定表中,避免手动插入时可能出现的类型不匹配问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值