多对多关系数据库不起作用


multi to multi relational database not working

我正在自己研究关系数据库,在阅读了一些文章后,我在实现它们时遇到了麻烦。

由于我缺乏关系数据库的经验,我相信我的错误可能出现在以下 3 个步骤中的任何一个(如果不是所有 3 个)步骤中:

  • 表创建
  • 价值插入
  • 查询调用

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

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

表格:

对于抽象,我选择拥有他们喜欢的人和饮料(一个人可以喜欢很多饮料,一杯饮料可以被很多人喜欢。

下面是表 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`)
)

注意:从这里我看到了第三个表给出的示例,并且几乎复制了它。

值插入:

人员输入:

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')

人饮料输入:

注意:饮料的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的饮料的人的名字。我没有收到错误,但我没有得到任何输出。

你说饮料的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 或类似的东西。我认为你的顺序是错误的。

您的多对多表需要外语键:

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 会告诉您您的关系是否有问题。

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