从含带引号NULL值的CSV文件向MySQL表插入数据时触发外键约束错误的解决方法咨询
解决LOAD DATA INFILE导入时"null"字符串引发的外键约束错误
你猜的没错!问题确实出在CSV里带引号的"null"被MySQL当成字符串'null'插入到superssn字段了。因为superssn是外键,要求值要么是NULL,要么是employee表中已存在的ssn值,而字符串'null'显然不符合这个要求,所以触发了外键约束冲突。
下面给你两种实用的解决办法:
方法一:在LOAD DATA命令中转换"null"为NULL值
这是最便捷的方式,不需要修改源CSV文件,直接通过SQL的NULLIF函数把读取到的'null'字符串转换成MySQL的NULL值。
修改后的导入命令如下:
LOAD DATA INFILE '/var/lib/mysql-files/employee.dat' INTO TABLE employee FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' -- 根据你的操作系统调整,Windows用'\r\n' (@fname, @minit, @lname, @ssn, @bdate, @address, @sex, @salary, @superssn, @dno) SET fname = @fname, minit = @minit, lname = @lname, ssn = @ssn, bdate = @bdate, address = @address, sex = @sex, salary = @salary, superssn = NULLIF(@superssn, 'null'), -- 核心:将'null'转为NULL dno = @dno;
解释:
- 我们先用用户变量
@superssn读取CSV中的对应字段值,然后通过NULLIF(@superssn, 'null')判断:如果变量值等于字符串'null',就返回NULL,否则返回原变量值。 - 这样Jared的
superssn会被设置为合法的NULL,而Brad的superssn是'111111100',刚好对应Jared的ssn,完全符合外键约束要求。
方法二:修改CSV源文件
如果你更倾向于调整源数据,可以把CSV里的"null"替换为空值(也就是去掉引号,让字段位置变成空)。比如把Jared那一行修改为:
"Jared","D","James","111111100","1966-10-10","123 Peachtree, Atlanta, GA","M","85000.00",,"6"
这样当你执行原来的LOAD DATA命令时,空的字段会被MySQL自动识别为NULL值,同样能解决外键问题。不过这种方法适合小文件,如果CSV文件很大,修改起来效率不如方法一。
额外注意:
- 确保
LINES TERMINATED BY参数和你的CSV文件换行符匹配,避免出现行读取错误; - 确认
department表中已经存在number=6的记录,否则dno字段的外键约束也会报错(你说之前数据正常,应该已经满足这个条件了)。
内容的提问来源于stack exchange,提问作者dnaiel
相关产品推荐
相关产品推荐

