2013-10-23 87 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