2013-10-23 90 views
1

我正在學習關係型數據庫,在閱讀了一些文章後,我無法實現它們。多對多關係數據庫不能正常工作

由於我缺乏與關係數據庫的經驗,我相信我的錯誤可以是任何以下3種(如果不是在所有3)步驟:

  • 表銳
  • 價值加入
  • 查詢電話

我應該指出,沒有任何語法錯誤或類似的東西。

我們在談論我的理解錯誤,所以我會詳細討論這個問題。

的表格:

因爲我選擇了讓人們的抽象和他們喜歡(1人可以喜歡很多飲料的飲料,喝一杯可以被許多人喜歡

這裏是。爲表People代碼(它有2名,以及一個主鍵):

CREATE TABLE `People` 
(
    `PeopleID` INT NOT NULL AUTO_INCREMENT, 
    `FirstName` VARCHAR(25), 
    `LastName` VARCHAR(25) NOT NULL, 
    PRIMARY KEY (`PeopleID`) 
) 

下面是表Drinks(飲料的名稱,在菜單或類似的,例如與主鍵的東西有些數)

CREATE TABLE `Drinks` 
(
    `DrinksID` INT NOT NULL AUTO_INCREMENT, 
    `Code` VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL, 
    `Name` VARCHAR(100) NOT NULL, 
    PRIMARY KEY (`DrinksID`) 
) 

最後是表PeopleDrinks

CREATE TABLE `PeopleDrinks` 
(
    `DrinksID` INT NOT NULL default 1, 
    `PeopleID` INT NOT NULL default 1, 
    PRIMARY KEY (`DrinksID`,`PeopleID`) 
) 

注:從here我看到的例子給出了第三個表和幾乎複製它。

值插入:

人輸入:

INSERT INTO People (FirstName, LastName) VALUES ('John', 'Smith') 
INSERT INTO People (FirstName, LastName) VALUES ('Sam', 'Johnson') 
INSERT INTO People (FirstName, LastName) VALUES ('Michael', 'Morgan') 

飲料輸入:

INSERT INTO Drinks (Code, Name)VALUES ('#543', 'Beer') 
INSERT INTO Drinks (Code, Name) VALUES ('#132', 'Vodka') 
INSERT INTO Drinks (Code, Name) VALUES ('#123', 'Wine') 

PeopleDrinks輸入:

注:的飲料的ID是4,5和6. 不是 1,2,3.

INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (1, 4) 
INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (2, 5) 
INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (3, 6) 

以上我們給每個人一個最喜歡的飲料。下面我們就應該有一個人喜歡所有的飲料:

INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (1, 5) 
INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (1, 6) 

最後查詢電話:

//Consider $link an established, working connection to the database 
$result = mysqli_query($link, "SELECT 
    `People`.* 
FROM 
    `People` 
JOIN 
    `PeopleDrinks` ON `People`.`PeopleID` = `PeopleDrinks`.`PeopleID` 
WHERE 
    `PeopleDrinks`.`DrinksID` = 5"); 

while($row = mysqli_fetch_array($result)) 
{ 
     echo $row['FirstName'] . " " . $row['LastName']; 
     echo "<br/>"; 
} 

上面的代碼,應打印任何人誰與ID 5.我喜歡喝的名字不要錯誤,但我沒有得到任何輸出。

+0

難道你不應該插入PeopleDrinks(DrinksID,PeopleID)VALUES(5,5)'? DrinksID的值始終爲1 .. –

+0

根據您插入PeopleDrinks,飲料ID爲1,2,3。看到我的回答 –

回答

1

你說的飲料ID是4,5,6 在插入您使用

INSERT INTO PeopleDrinks (DrinksID, PeopleID)VALUES (1, 4) 
INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (2, 5) 
INSERT INTO PeopleDrinks (DrinksID, PeopleID) VALUES (3, 6) 

的飲料IDS(第一號)是1,2,3,而不是4,5, 6或類似的東西。我認爲你的訂單是錯誤的。

+0

是的,這就是答案。我已將DrinksID值與PeopleID交換。非常感謝! – Bloodcount

1

你的多對多的表需要夷鍵:

CREATE TABLE `PeopleDrinks` (
    `DrinksID` INT NOT NULL, 
    `PeopleID` INT NOT NULL, 
    PRIMARY KEY (`DrinksID`,`PeopleID`), 
    FOREIGN KEY (`DrinksID`) REFERENCES `Drinks`(`DrinksID`), 
    FOREIGN KEY (`PeopleID`) REFERENCES `People`(`PeopleID`) 
) 

刪除DrinksID和的peopleid的默認值,這是毫無意義的。

然後,當你做你的插入,你會確保你試圖插入的數據是正確的。

我認爲你的插入是錯誤的。當你說你的身份證是他們的時候,你錯了。如果您正在進行大量的插入和刪除操作,則尤其如此。自動增量將永遠持續下去,而且你無法確定。使用外鍵,RDBMS會告訴你關係是否有問題。

無論如何,您的查詢看起來不錯,所以沒有問題。

+0

已註明,並將進行更新以改善表格。 – Bloodcount