1

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

由于我缺乏关系数据库方面的经验,我相信我的错误可能出现在以下 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')

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

4

2 回答 2

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 或类似的东西。我认为你的订单是错误的。

于 2013-10-23T08:02:09.073 回答
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 的默认值,这没有任何意义。

然后,当您进行插入时,您将确定您尝试插入的数据是正确的。

我认为您的插入是错误的。当你说你的 ID 就是它们的样子时,你错了。如果您正在执行大量插入和删除,则尤其如此。自动增量将永远持续下去,你不能确定。使用外键,RDBMS 会告诉您您的关系是否有问题。

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

于 2013-10-23T08:04:58.870 回答