多对多关系数据库无法正常工作

时间:2013-10-23 07:55:56

标签: php mysql

我正在研究自己的关系数据库,在阅读了一些文章后,我无法实现它们。

由于我缺乏关系数据库的经验,我认为我的错误可以是以下3个步骤中的任何一个(如果不是全部3个):

  • Table Creaton
  • 价值插入
  • 查询电话

我应该指出,没有任何语法错误或类似的东西。

我们正在谈论我的理解中的错误,因此我将详细解决问题。

表格:

对于抽象,我选择了人们和他们喜欢的饮料(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的饮料的人的名字。我没有收到错误,但我没有得到任何输出。

2 个答案:

答案 0 :(得分:1)

你说饮料的ID是4,5,6 在INsert中你使用了

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

饮料ID(第一个数字)是1,2,3而不是4,5,6或类似的东西。我认为你的订单是错误的。

答案 1 :(得分: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会告诉您关系是否有问题。

无论如何,你的查询看起来很棒,所以没问题。