[英]Foreign Key Failure in MySQL
我創建了一個由三個表組成的數據庫。 這是使用外鍵創建表時的查詢。
CREATE TABLE reporter
(
reporterid INT NOT NULL AUTO_INCREMENT,
firstname VARCHAR(1000) NOT NULL,
lastname VARCHAR(100) NOT NULL,
PRIMARY KEY (reporterid)
);
CREATE TABLE flood
(
floodid INT NOT NULL AUTO_INCREMENT,
address VARCHAR(500) NOT NULL,
description VARCHAR(1000) NOT NULL,
dateofflood DATE NOT NULL,
timeofflood INT NOT NULL,
PRIMARY KEY (floodid)
);
CREATE TABLE reports
(
reportid INT NOT NULL AUTO_INCREMENT,
timereport NODATATYPE NOT NULL,
datereport DATE NOT NULL,
rid INT NOT NULL,
fid INT NOT NULL,
PRIMARY KEY (reportid),
FOREIGN KEY (rid) REFERENCES reporter(reporterid),
FOREIGN KEY (fid) REFERENCES flood(floodid)
);
我創建了一個系統,以便通過PHP在數據庫中添加記錄/行。 這是我的代碼:
<?php
mysql_connect("localhost", "root", "") or die("Connection Failed");
mysql_select_db("flooddatabase")or die("Connection Failed");
$description = $_POST['description'];
$address = $_POST['address']; // Make sure to clean the
$dateofflood=$_POST['dateofflood'];
$timeofflood=$_POST['timeofflood'];
$firstname=$_POST['firstname'];
$lastname=$_POST['lastname'];
$dateofreport=$_POST['dateofreport'];
$ timeofreport = $ _ POST ['timeofreport'];
$query = "INSERT into flood(address,description,dateofflood,timeofflood) values ('$address','$description','$dateofflood','$timeofflood')";
$query2 = "INSERT into reporter(firstname,lastname) values ('$firstname','$lastname')";
$query3 = "INSERT into reports(dateofreport,timeofreport) values ('$dateofreport','$timeofreport')";
if(mysql_query($query))
if(mysql_query($query2))
if(mysql_query($query3))
{
echo "";
} else
{
echo "fail";
}
?>
我得到的結果很好。 只是,在我的REPORTS表中,沒有生成任何外鍵。 例如,我在記者表和泛洪表上輸入了一些內容,外鍵“ rid”和“ fid”沒有引用這兩個表的值。 需要幫助謝謝。
現在,使您的最后一個插入語句如下所示:
"INSERT into reports(dateofreport,timeofreport,rid,fid) values ('$dateofreport','$timeofreport',$r_id,$f_id)";
我沒有給您直接復制粘貼解決方案。
如果您需要了解如何通過執行插入查詢來獲取最后插入的ID,請查看此鏈接
沒有正在生成的外鍵
我不確定您的意思。 外鍵不是“生成”的。 主鍵可以是,您可以這樣做:
reporterid INT NOT NULL AUTO_INCREMENT
(以及其他兩個表)
外鍵“ rid”和“ fid”沒有值
好吧,看看您的查詢:
INSERT into reports(dateofreport,timeofreport) values ...
您在哪里插入rid
和fid
值? 實際上,我很驚訝這個查詢在所有工作,因為這些列不允許NULL
值:
rid INT NOT NULL,
fid INT NOT NULL,
(盡管您的列名也沒有對齊,所以我發現您顯示的代碼實際上不是您正在使用的代碼...)但是,除此之外,事實仍然是,如果您希望在這些領域的一個值,那么你必須把這些字段的值:
INSERT into reports(dateofreport,timeofreport,rid,fid) values ...
每個查詢之后,您可以從mysql_insert_id()
獲取最后生成的標識符:
$last_id = mysql_insert_id();
然后使用它填充在后續查詢中作為外鍵插入的值。
同樣值得注意的是, mysql_*
庫早已不推薦使用,並已被mysqli_
和其他庫(如PDO
取代。 我強烈建議您升級到最新技術,因為任何供應商均不支持您使用的技術。
此外,這非常重要 ,您的代碼對SQL注入攻擊很開放 。 這基本上意味着您可以執行用戶發送給您的所有代碼。 您應該將用戶輸入視為值,而不是可執行代碼。 這是開始閱讀關於這個問題的好地方,因為是這樣 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.