Mysql忽略外键错误

时间:2014-05-06 14:13:46

标签: mysql bash foreign-keys constraints

我有一个BASH程序,可以在我的数据库中插入一些行。 不幸的是,当MYSQL遇到错误(特别是外键约束错误)时,整个SQL请求都会停止。

是否有办法跳过外键约束不适用的行,并继续添加其他

    insertVtigerInfos() {
$mysql -h $db_address -u $db_user -p$db_passwd $db_name -e "delete from $db_vtiger_name;load data local infile '$vtiger_temporary_file' REPLACE INTO TABLE $db_vtiger_name fields terminated by ';'"
}


    ----------------------démarrage---------------------------------
Tue May  6 16:03:13 CEST 2014
ERROR 1452 (23000) at line 1: Cannot add or update a child row: a foreign key constraint fails (`RH2QUALIF`.`info_vtiger`, CONSTRAINT `info_vtiger_ibfk_1` FOREIGN KEY (`nom_caisse`) REFERENCES `definition_ip_switch` (`nom_caisse`) ON DELETE CASCADE ON UPDATE CASCADE)
-------------------------fin------------------------------------
Tue May  6 16:03:14 CEST 2014

使用示例更新线程: 外键约束适用的表:

+-------------+------------+
| nom_caisse  | quat_octet |
+-------------+------------+
| BCP         | NULL       |
| CEA         | NULL       |

具有外键约束的表:

+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| code_site       | varchar(32) | NO   | PRI | NULL    |       |
| nom_caisse      | varchar(32) | NO   | MUL | NULL    |       |
| ip_routeur      | varchar(32) | NO   |     | NULL    |       |

试图插入数据:

131001M0;CEA;<ip>
131001G0;CEALS;<ip>

当mysql尝试插入行时,第一个是OK,第二个不是(因为CEALS不在外键所在的表中)。 但是mysql没有添加任何行,因为他找到了一个不匹配的...我只是想让它添加第一行......

2 个答案:

答案 0 :(得分:1)

我找到的唯一解决方案是:

$mysql -f -h $db_address -u $db_user -p$db_passwd $db_name -e "SET foreign_key_checks=0;delete from $db_vtiger_name;load data local infile '$vtiger_temporary_file' REPLACE INTO TABLE $db_vtiger_name fields terminated by ';';SET foreign_key_checks=1;"

然后发送另一个根据外键删除行的请求。

delete from info_vtiger where NOT EXISTS ( select nom_caisse from definition_ip_switch where definition_ip_switch.nom_caisse=info_vtiger.nom_caisse ) ;

不幸的是,在这种情况下,外键约束不再有用。 如果有人有其他方法可以将它作为解决方案发布...

答案 1 :(得分:0)

如果您的要求只是插入新记录但不能替换现有记录,那么您可以按照以下方式使用:

$mysql -h $db_address -u $db_user -p$db_passwd $db_name -e "delete from $db_vtiger_name;load data local infile '$vtiger_temporary_file' INSERT IGNORE INTO TABLE $db_vtiger_name fields terminated by ';'"