【问题标题】:Mysql ignore foreign key errorsMysql忽略外键错误
【发布时间】:2014-06-23 05:10:20
【问题描述】:

我有一个 BASH 程序,可以插入我的 DB somes 行。 不幸的是,当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尝试插入行时,第一个可以,第二个不行(因为CEALS不在外键所在的表中。 但是mysql没有添加任何行,因为他发现一个不匹配...我只是希望它添加第一行...

【问题讨论】:

  • 尝试 SET FOREIGN_KEY_CHECKS = 0; 但在执行脚本后将其设置为 1
  • 这将添加所有行,即使是不匹配的行。我只希望mysql在发现外键错误后继续运行
  • 根据docs 将 foreign_key_checks 设置为 1 不会触发对现有表数据的扫描。因此,在 foreign_key_checks = 0 时添加到表中的行将不会进行一致性验证
  • --force 选项不关心外键错误。它仍然停止

标签: mysql bash foreign-keys constraints


【解决方案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 ) ;

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

【讨论】:

    【解决方案2】:

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

    $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 ';'"
    

    【讨论】:

    • Mysql 在此插入忽略时向我发送错误:第 1 行的错误 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'INSERT IGNORE INTO TABLE info_vtiger fields 以 ';'' 终止附近使用正确的语法
    • @Gui O: 首先使用 '$vtiger_temporary_file' 作为 $vtiger_temporary_file 而不用单引号将其括起来,如果仍然出现错误,则共享此文件示例数据至少一行数据。
    • 我可以使用的另一个解决方案是设置 foreign_key_checks=0,插入然后将其放回值 1。然后发送另一个请求:从 info_vtiger 中删除其中 nom_caisse NOT IN defintion_ip_switch ??
    • set foreign_key_checks=0 意味着您允许子表中的行甚至在其父表中不存在意味着您正在使您的数据不一致..但是如果您确定您的数据是正确的并且存在无需进一步检查此数据,然后您就可以执行此操作...现在您的错误消息与与加载 infile 而非外键相关的语法错误有关,因此如果您共享详细信息,则可以解决您的问题。
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2015-10-29
    • 2011-05-15
    • 1970-01-01
    • 2012-04-12
    • 2012-07-01
    相关资源
    最近更新 更多