簡體   English   中英

無法插入:外鍵約束失敗

[英]Can't insert : A foreign key constraint fails

我有以下表格:

CREATE TABLE IF NOT EXISTS `location`(
    `ID` int(11) NOT NULL,
    `name` varchar(25) NOT NULL,
    `water` varchar(25) NOT NULL,
    `fodder` varchar(25) NOT NULL,
    `access` varchar(25) NOT NULL,
    PRIMARY KEY  (`ID`)
    KEY `water` (`water`)
    KEY `fodder` (`fodder`)
    KEY `access` (`access`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `watercondition`(
    `ID` int(11) NOT NULL,
    `watervalue` varchar(25) NOT NULL,
    PRIMARY KEY  (`watervalue`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `foddercondition`(
    `ID` int(11) NOT NULL,
    `foddervalue` varchar(25) NOT NULL,
    PRIMARY KEY  (`foddervalue`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `accesscondition`(
    `ID` int(11) NOT NULL,
    `accessvalue` varchar(25) NOT NULL,
    PRIMARY KEY  (`accessvalue`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

對於約束表:

ALTER TABLE `location`
    ADD CONSTRAINT `location_ibfk2` FOREIGN KEY (`water`) REFERENCES `watercondition` (`watervalue`),
    ADD CONSTRAINT `location_ibfk3` FOREIGN KEY (`fodder`) REFERENCES `foddercondition` (`foddervalue`),
    ADD CONSTRAINT `location_ibfk4` FOREIGN KEY (`access`) REFERENCES `accesscondition` (`accessvalue`);

在我的php文件中,我想向所有表格插入一個值,如下所示:

$sqlwater = "INSERT INTO  `watercondition` (`ID`, `watervalue`) VALUES ('".$_SESSION['loc_id']."', '$watervalue')";
$resultwater = mysqli_query($con, $sqlwater) or die (mysqli_error($con));

$sqlfodder = "INSERT INTO  `foddercondition` (`ID`, `foddervalue`) VALUES ('".$_SESSION['loc_id']."', '$foddervalue')";
$resultfodder = mysqli_query($con, $sqlfodder) or die (mysqli_error($con));

$sqlaccess = "INSERT INTO  `accesscondition` (`ID`, `accessvalue`) VALUES ('".$_SESSION['loc_id']."', '$accessvalue')";
$resultaccess = mysqli_query($con, $access) or die (mysqli_error($con));

$sqlloc = "INSERT INTO  `location` (`ID`, `name`) VALUES ('".$_SESSION['loc_id']."', '$name')";
$resultaccess = mysqli_query($con, $access) or die (mysqli_error($con));

但是當我執行php文件時,出現此錯誤:

不能添加或更新子行,外鍵約束失敗( mydblocation ,約束location_ibfk2外鍵( water )參考waterconditionwatervalue ))

當我檢查數據庫時, waterfodderaccess的值已經插入db了,但是不在我的location表中。

location表中的插入內容還必須包括waterfodderlocation列的值。 它們是location表中的列,不能被忽略。

另外,您在最終查詢中使用了錯誤的查詢變量。

我猜這里正在發生的事情是,在檢查所有的NOT NULL字段的值之前,MYSQL已對約束進行了驗證,因此在出現關於缺少列值的更為明顯的約束之前,您會遇到約束錯誤。

$sqlloc = "INSERT INTO  `location` 
           (`ID`, `name`, `water`, `fodder`, `location`) 
      VALUES ('{$_SESSION['loc_id']}', '$name', 
              '$watervalue', '$foddervalue', '$accessvalue' )";

$resultaccess = mysqli_query($con, $sqlloc) or die (mysqli_error($con));

更改您的最后一個插入語句,如下所示:

"INSERT INTO  `location` (`ID`, `name`,`water`,`fodder`,`access`) VALUES 
 ('".$_SESSION['loc_id']."', '$name','$watervalue','$foddervalue','$accessvalue')";

說明:

ERD:

在此處輸入圖片說明

看起來黃色標記的表是表,而location表是子表。

因此,根據MySQL,您無法通過相應的父表中不存在的某些外鍵值來添加或更新子表行( location )。

在前三個插入語句中,您將更新三個父表,這很好。

但是在您的最終插入語句中,您試圖更新子表,在該表中您沒有提供那些外鍵的值,這是一個例外

SQL字段

參考

您應該將外鍵插入到位置表中,以保持之前創建的關系。

您對位置的查詢應類似於

`$sqlloc = "INSERT INTO  'location' ('ID', 'name', 'water', 'footer', 'access') VALUES ('".$_SESSION['loc_id']."', '$name', 'water-related-id', 'fodder-related-id, 'access-related-id)";`

無論如何,表的主鍵應為“ id”列,外鍵應為其他表的主鍵,因此您的約束應為

ALTER TABLE 'location'
    ADD CONSTRAINT 'location_ibfk2' FOREIGN KEY ('water') REFERENCES 'watercondition' ('id'),
    ADD CONSTRAINT 'location_ibfk3' FOREIGN KEY ('fodder') REFERENCES 'foddercondition' ('id'),
    ADD CONSTRAINT 'location_ibfk4' FOREIGN KEY ('access') REFERENCES 'accesscondition' ('id');

並且,您的外鍵數據類型應與引用表的鍵匹配,在您的情況下為int(11)。


你是在做大學作業嗎?

這里要注意的兩點:

首先,插入操作無效,因為您將所有外鍵都設置為“ NOT NULL”字段,因此在位置表上插入記錄時,必須提供這些值。

其次,必須確保作為外鍵的字段在原始表上具有相同的數據類型。 在您的代碼中,您正在原始表上使用INT(11)id字段,但在位置表上使用了VARCHAR(25),並且您鏈接到保存該值的字段,而不是鏈接到該字段的主鍵(id)字段參考表。

親切的問候,丹尼爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM