iT邦幫忙

0

無法INSERT INTO有外鍵的資料表[新手發問]

各位前輩,我是新手:
這個問題找了一個禮拜,有買了3本書在學習
目前在練習會員系統

關於在INSERT INTO沒有外鍵的TABLE都正常
但是若是要新增資料到 有外鍵的 TABLE 都失敗
出現error:Cannot add or update a child row: a foreign key constraint fails

到底要怎麼才能成功新增資料,希望各位前輩能給個方向,非常感激!

TABLE HOTEL的Client_ID 跟 TABLE Client 的 Client_ID是關聯

create table hotel (
  id int unsigned not null auto_increment primary key
, hotel_id char(8) not null
, Client_id int unsigned not null 
, hotel char(8) not null
, room char(8) not null
, kind char(8) not null
, tablenum char(8) not null
, host char(8) not null
, foreign key (Client_ID) references actresses (id)
);

$hihotel=$_POST["hotel"];
$hiroom=$_POST["room"];
$hikind=$_POST["kind"];
$hitablenum=$_POST["tablenum"];
$hihost=$_POST["host"];

$insert_hotel_SQL = "INSERT INTO `hotel` (`hotel`, `room`, `kind`, `tablenum`, `host`) 
VALUES ('$hihotel','$hiroom','$hikind','$hitablenum','$hihost') 
WHERE Client_ID = $row['Client_ID']";

$selectSQL = "SELECT * FROM hotel";
$myData_hotel = $myconnect->query($insert_hotel_SQL);

if ($myData_hotel) {
    echo '新增成功';
    echo '流水號是' . $myconnect->insert_id;
} else {
    echo 'error' . $insert_hotel_SQL . '<br>' . $myconnect->error;
}


看更多先前的討論...收起先前的討論...
https://ithelp.ithome.com.tw/questions/10198819
你的問題這裡會有人教你
ckp6250 iT邦好手 1 級 ‧ 2020-06-09 15:15:58 檢舉
殺豬大生意做不完了。
以前寫的系列,這裡有外鍵限制的討論 , 連續4篇.
https://ithelp.ithome.com.tw/articles/10140269
怎麼那麼剛好我們正在玩這系列。就有人剛好有這樣的問題啊。
也太神了吧。
謝謝一級屠豬士
我有看到這篇文章
ALTER TABLE Worklog
DROP FOREIGN KEY Worklog_ibfk_1
,
ADD CONSTRAINT FOREIGN KEY (galid) REFERENCES Girls (galid)
ON UPDATE CASCADE
ON DELETE CASCADE;
刪掉原本的限制,新增限制.

刪掉原本的限制--->然後INSERT INTO新增資料以後--->在新增限制

請問這樣新增的資料會在正確的關聯(外鍵)裡面嗎?
當然不是刪掉限制再新增.我那是用來說明的.
有好幾位幫友已經跟你說了一般的用法,你應該要先有對應的資料.
限制是有用處的.
3
一級屠豬士
iT邦大師 1 級 ‧ 2020-06-10 10:06:54
最佳解答

寫了一篇簡單範例, 你參考一下.
https://ithelp.ithome.com.tw/articles/10231864

看更多先前的回應...收起先前的回應...

拜託,都沒加註18 禁上班勿看

我光是 Google 那個番號
就被旁邊的同事使出白眼攻擊
/images/emoticon/emoticon05.gif

你不要google 番號啊

通靈亡 iT邦研究生 2 級 ‧ 2020-06-10 10:26:56 檢舉

謝謝老司機大大的無私分享 /images/emoticon/emoticon41.gif

你不要google 番號啊

改不掉的壞習慣
什麼阿沙不魯的都拿去 Google
看看會出現什麼有趣的內容
/images/emoticon/emoticon50.gif

1
r567tw
iT邦新手 3 級 ‧ 2020-06-09 14:06:16

你可能要先了解到底甚麼是外鍵, foreign key , 如果沒有外鍵所參照的資料, 那麼外鍵自然就不能新增資料, 你需要先建立被參照的資料

你好,因為都潛水看文章剛剛無法回應

我有先建立幾筆有關連的資料了。
謝謝你

0
通靈亡
iT邦研究生 2 級 ‧ 2020-06-09 15:29:04

我用一個例子比喻你遇到的錯誤:
餐廳顧人怨客戶:我想要點一份「G8」套餐
服務生:先生不好意思,我們的菜單上只有「A2」、「B3」套餐,沒有「G8」號餐喔
餐廳顧人怨客戶:我不管,回去叫你們餐廳主廚想!

所以

  1. 餐廳的菜單上必須先發明「G8」套餐 (新增來源的資料)
  2. 顧人怨客戶才能點「G8」套餐 (外來鍵才能參考來源的資料表欄位)

否則餐廳菜單上沒有「G8」套餐,顧人怨客戶無法點「G8」套餐

這是外來鍵的其中一項限制:Referential integrity constraint(參考完整性規則)
被參考的來源欄位必須有資料是「G8」,參考資料的外來鍵欄位才能是「G8」

看更多先前的回應...收起先前的回應...

你因該要補充
「服務生:先生不好意思,沒有就是沒有,我們沒辦法給你不在菜單上的東西」(error:Cannot add or update a child row: a foreign key constraint fails)

然後解決的方式,將A2改為G8。或是新增日G1 G2 G3 就是不給G8

謝謝浩瀚星空

我的父資料表是有這一筆G8的,但還是出現(找不到G8的錯誤)
檢查關聯也是正常的

所以出現這個錯誤還是看不懂

通靈亡 iT邦研究生 2 級 ‧ 2020-06-09 18:09:39 檢舉

把你的父資料表跟要新增的資料貼出來才能知道為什麼沒辦法關聯到G8

有可能被資料庫當奧客了

我猜他是用G8來關聯,不是用id. 不過到現在都還沒看到code.
我會另外發一篇,舉例說明.

話說~~我只是開玩笑的回一下。你們怎麼就一直用G8下去了。

sayyes32334
有沒有資料我並沒辦法知道,只有你知道。
我只能跟你說,出現這個錯誤。就是關聯不到。沒資料。

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-06-09 16:12:13

假設有兩個table, 訂單(Order)和會員(Member)
其中訂單裡設定外鍵
CONSTRAINT Order_fk FOREIGN KEY (memberid) REFERENCES Member (memberid)

如果你 INSERT INTO Order 那筆資料裡的memberid
在 Member table 找不到的話
就會得到你這個錯誤訊息

解決方法
在 Insert into Order 之前
Member 這裡先要有對應 member id 的資料

我要發表回答

立即登入回答