我有一个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没有添加任何行,因为他找到了一个不匹配的...我只是想让它添加第一行......
答案 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 ';'"