为什么要为表生成多个索引?

时间:2016-11-01 04:37:35

标签: mysql phpmyadmin

我刚刚意识到我的一个表“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);

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

首先你的问题:

  

它们是否可以由JOINS生成?

没有。外键由数据定义语句生成,如CREATE TABLEALTER TABLE等。

  

我不知道为什么要生成多个实例。

创建数据库的人必须认为它们会有用。或者,如果你通过一些sql-tool创建了数据库(不知道),该工具创建了外键,因为它被告知这些字段之间存在关系。

为什么拥有密钥可能不错:

创建外键以显示不同表格之间的关系。

当您执行可能破坏数据完整性的操作时,它们也会强制执行特定行为。您可以在上一个屏幕截图中更改此行为。

对于每个外键,您可以提供一个名称,当您尝试对抗约束时,该名称将显示在错误消息中。如果更改或删除父字段,则可以定义外键的行为方式。

例如

您有以下表格,显示哪个工具属于哪个人。

<强>人

  • PERSONID
  • 姓名
  • 名字
  • ...

工具

  • toolid
  • personid(foreign keypersons
  • 名称
  • ....

因此,在工具表中,您拥有人员表的外键,此字段定义工具的所有者。

现在让我们定义一些用例

假设:出于某种原因,彼得不再能够使用任何工具,因此他不再适合数据库。

他的工具应该怎么办?这取决于您的数据库显示的内容!

  1. 您的数据库显示曾拥有工具的任何人。
  2. 这意味着,即使该人实际上不再存在,数据仍应保留。否则你实际上会强制执行这种行为,但是在我们当前的情况下它可以用来显示外键可以做什么。

    因此,我们为ON DELETE选择的操作是RESTICT。 (这也是默认动作)

    现在让我们试着打电话:DELETE FROM persons WHERE firstname = 'Peter'

    结果:外键约束将提示您输入错误消息。在人员表中存在依赖于此条目的关系。

    1. 数据库显示人员和一些工具,工具不必拥有所有者
    2. 在这种情况下,我们再次想删除彼得。他的工具可以保留在数据库中,而不是人员,他们将在此字段中获得空值。

      因此,我们选择操作ON DELETESET NULL

      这个很直接。重要提示:外键的字段不得具有NOT NULL constraint

      1. 数据库显示建筑物中的人员和工具......
      2. 因此,如果彼得和他的工具离开建筑物,我们就不再关心它们了。

        ON DELETE的操作:CASCADE

        如果您现在输入DELETE - 语句,外键将负责删除连接到Peter的所有其他条目(工具)。