Mysql

SQL 錯誤 1452:無法添加或更新子行:外鍵約束失敗

  • February 7, 2022

我正在嘗試按照本指南安裝 Zabbix 。成功執行 scheme.sql 後嘗試執行 data.sql 時遇到以下問題

mysql -D zabbix -uzabbix -pPassword < /home/zabbix/zabbix-2.4.5/database/mysql/schema.sql

mysql -D zabbix -uzabbix -pPassword < /home/zabbix/zabbix-2.4.5/database/mysql/data.sql

第 2989 行的錯誤 1452 (23000):無法添加或更新子行:外鍵約束失敗 (‘zabbix’.‘sysmaps_elements’, CONSTRAINT ‘c_sysmaps_elements_2’ FOREIGN KEY (‘iconid_off’) REFERENCES ‘images’ (‘imageid’ ))

我無法弄清楚為什麼我無法添加或更新子行,它對我來說看起來非常好。

腳本可以從這裡下載

  1. 檢查sql執行的順序。schema.sql –> images.sql –> data.sql
  2. 確保實際輸入了圖像數據。從圖像中選擇 *;

這是因為在某些 DB 中未設置自動送出,因此未執行 images.sql。這是因為沒有“送出”;在 images.sql 的最後一句中。所以添加語句“commit;” 到 images.sql。

您可以使用如下所示的頁眉和頁腳更新 data.sql:

– 將這些行作為標題添加到您的 MYSQL 數據腳本中

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 

– 將這些行作為頁腳添加到您的 MYSQL 數據腳本

UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;    
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

這將使您能夠在沒有任何外部檢查的情況下恢復數據。

更新:您可以通過包含頁眉和頁腳重新建構 data.sql 文件:

cat header.sql data.sql footer.sql > data_NEW.sql

引用自:https://dba.stackexchange.com/questions/99316