我刚刚意识到我的一个表“pclass”有多个外键的多个实例。在Structure选项卡中,#2-5是外键。我不知道为什么要生成多个实例。
它们是否可以由JOINS生成?如果我需要提供其他信息,请告诉我。
$brother_id = htmlspecialchars($_GET["brother_id"]);
$selected = $brother_id;
$query_brotherId = "SELECT b.id, b.firstname, b.lastname, b.pname, b.country, b.street01, b.street02, b.city, usStates.abv AS us_state, b.intl_state, b.postalcode, b.zipcode, b.phone, b.email, pclass.id AS pclass_id, greekAlphabet.name AS pclass01, prepclass.name AS prepclass, pclassSuffix.name AS pclass02, semester.name AS pclass_sem, pclass.year AS pclass_year, b.bigbrother_id AS bbID, bb.firstname AS bbFirst, bb.lastname AS bbLast, b.status, b.comments
FROM brothers AS b
LEFT JOIN pclass ON b.pclass_id = pclass.id
LEFT JOIN prepclass ON pclass.prepclass_id = prepclass.id
LEFT JOIN greekAlphabet ON pclass.greekAlphabet_id = greekAlphabet.id
LEFT JOIN pclassSuffix ON pclass.suffix_id = pclassSuffix.id
LEFT JOIN semester ON pclass.semester_id = semester.id
LEFT JOIN usStates ON b.us_state = usStates.id
LEFT JOIN brothers AS bb ON b.bigbrother_id = bb.id
WHERE b.id = $brother_id";
$result_brotherId = mysqli_query($link, $query_brotherId);
答案 0 :(得分:1)
首先你的问题:
它们是否可以由JOINS生成?
没有。外键由数据定义语句生成,如CREATE TABLE
,ALTER TABLE
等。
我不知道为什么要生成多个实例。
创建数据库的人必须认为它们会有用。或者,如果你通过一些sql-tool创建了数据库(不知道),该工具创建了外键,因为它被告知这些字段之间存在关系。
为什么拥有密钥可能不错:
创建外键以显示不同表格之间的关系。
当您执行可能破坏数据完整性的操作时,它们也会强制执行特定行为。您可以在上一个屏幕截图中更改此行为。
对于每个外键,您可以提供一个名称,当您尝试对抗约束时,该名称将显示在错误消息中。如果更改或删除父字段,则可以定义外键的行为方式。
例如
您有以下表格,显示哪个工具属于哪个人。
<强>人强>
工具强>
foreign key
至persons
)因此,在工具表中,您拥有人员表的外键,此字段定义工具的所有者。
现在让我们定义一些用例
假设:出于某种原因,彼得不再能够使用任何工具,因此他不再适合数据库。
他的工具应该怎么办?这取决于您的数据库显示的内容!
这意味着,即使该人实际上不再存在,数据仍应保留。否则你实际上会强制执行这种行为,但是在我们当前的情况下它可以用来显示外键可以做什么。
因此,我们为ON DELETE
选择的操作是RESTICT
。 (这也是默认动作)
现在让我们试着打电话:DELETE FROM persons WHERE firstname = 'Peter'
结果:外键约束将提示您输入错误消息。在人员表中存在依赖于此条目的关系。
在这种情况下,我们再次想删除彼得。他的工具可以保留在数据库中,而不是人员,他们将在此字段中获得空值。
因此,我们选择操作ON DELETE
:SET NULL
这个很直接。重要提示:外键的字段不得具有NOT NULL constraint
。
因此,如果彼得和他的工具离开建筑物,我们就不再关心它们了。
ON DELETE
的操作:CASCADE
。
如果您现在输入DELETE
- 语句,外键将负责删除连接到Peter的所有其他条目(工具)。