我是MySQL和数据库的新手。昨天我遇到了这个How to store multiple options in a single table?。我几乎没有与之相关的问题如下:
什么是关键字(studentId,courseId)以及参数是什么。以及如何在PhpMyAdmin中执行此操作。
PhpMyAdmin中的索引按钮是什么(查询代码为ADD INDEX
)。
如果我想将列作为外键,可能在子表中有多余值,我该怎么办?现在我将该列编入索引而不是使其唯一。它是否正确或有更好的方法可以做到这一点?
答案 0 :(得分:0)
1)A" key"适用于它"最重要的事情",并且始终是独一无二的。 "小学"由于这个原因,通常用作唯一标识符。
2)索引适用于稍后检索记录的速度。就像在书的后面有一个列表一样。
3)外键只是对不同表中主键的引用。更容易弄清楚如何加入事物。
答案 1 :(得分:0)
我在该链接中的答案显示以下三个键(它们是索引)。 KEY和INDEX是同义词。
那里有手动页面链接和其他链接。至于SCJunction表中的键(忽略主键),它们是
unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
key (studentId,courseId),
key (courseId,studentId),
所以这是他们的重要性。首先,刚才显示的所有3个都是复合索引。对#2和#3的订单进行了翻转,因此根据您的数据之后的查询范围, db引擎可以选择哪个索引用于基于的最快检索最左边的列。
我将在短期内扩展最左侧的概念。
对于唯一键#1,它旁边的注释声明强制执行没有重复(意味着垃圾数据)是相当不言自明的。例如,学生1课程1学期1在该表中不能存在两次。
确实可以通过将所有用户及其吞吐量减少到以下两个来简化这些索引:
unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
key (courseId,studentId),
这三个用于说明目的,当我试图在那里增加答案的深度时,你暴露了一个事实,即没有必要额外的KEY(INDEX)。因为UNIQUE键(以另一种方式)将满足三者的条件。希望下面显示的示例可以为此增加一些清晰度。
两个示例查询,说明了复合索引,以及为什么有两个
Kim接受这个学期多少课程(学期= 100)
select count(*) as courseCount
from SCJunction
where studentId=2 and term=100
+-------------+
| courseCount |
+-------------+
| 3 |
+-------------+
答案可能是2,因为我们在该示例中删除了Kim的课程(在其他问题/答案链接中)
有多少学生参加乔(Chaucer)课程(courseId = 5,term = 100)?
select count(*) as studentCount
from SCJunction
where courseId=5 and term=100
+--------------+
| studentCount |
+--------------+
| 2 |
+--------------+
上面的两个查询将受益于索引,但不是同一个索引。这是因为where子句是基于不同的标准进行搜索的。在两个不同索引中存在最左侧的列的标准。最左边的意思是,对于复合索引,从左边和右边开始(就像你用英文读的那样),这是一个可以使我的搜索受益的索引。如果不是,则不使用它。如果没有使用,您将获得所有数据的可怕表扫描,而无需使用索引。
复合索引的使用可能是部分,这样只有一定数量的列(从最左边开始)才能用于db引擎。但至少索引用于获取该数据子集。
答案 2 :(得分:0)
您需要了解SQL的基础知识。
密钥,有很多密钥类型,有主键,它唯一地标识数据库表中的每条记录,注意密钥可能存在于多个字段中。还有外键,它定义了与另一个表的关系。
索引是加速数据检索的特殊数据库结构。有很多索引类型。您可以阅读更多相关信息here
@durbnpoisn 解释了3个问题