什么时候我应该使用键,主键,唯一键和索引?
当前回答
主键和唯一键很相似,只是功能不同。主键使表行唯一(即不能有两个具有完全相同键的行)。一个数据库表中只能有一个主键。
唯一键使表行中的表列是唯一的(即,没有两个表行可能具有完全相同的值)。您可以有多个唯一键表列(不像主键,这意味着表中只有一个表列是唯一的)。
INDEX还创建唯一性。MySQL(示例)将为被索引的列创建索引表。这样,在对索引表列查询查询时,更容易检索表行值。缺点是,如果你做很多更新/删除/创建,MySQL必须管理索引表(这可能是一个性能瓶颈)。
希望这能有所帮助。
其他回答
唯一密钥:
可以有多个值为空。 任何两个元组在唯一键中都不能有相同的值。 一个或多个唯一键可以组合成一个主键,反之则不行。
主键
可以包含多个唯一键。 唯一表示一个元组。
KEY和INDEX是MySQL中的同义词。它们是同一个意思。在数据库中,您可以使用索引来提高数据检索的速度。索引通常创建在JOIN、WHERE和ORDER BY子句中使用的列上。
Imagine you have a table called users and you want to search for all the users which have the last name 'Smith'. Without an index, the database would have to go through all the records of the table: this is slow, because the more records you have in your database, the more work it has to do to find the result. On the other hand, an index will help the database skip quickly to the relevant pages where the 'Smith' records are held. This is very similar to how we, humans, go through a phone book directory to find someone by the last name: We don't start searching through the directory from cover to cover, as long we inserted the information in some order that we can use to skip quickly to the 'S' pages.
主键和唯一键类似。主键是可以唯一标识一行的列或列的组合。它是唯一键的特殊情况。一个表最多可以有一个主键,但可以有多个唯一键。在列上指定唯一键时,表中任何两个不同的行都不能具有相同的值。
还要注意,定义为主键或唯一键的列在MySQL中会自动建立索引。
KEY和INDEX是同义词。
当性能测量和EXPLAIN显示查询由于缺少索引而效率低下时,您应该添加索引。添加索引可以提高查询的性能(但会降低对表的修改速度)。
当您希望将该列(或多个列)中的值限制为惟一时,应该使用UNIQUE,以便尝试插入重复的值会导致错误。
PRIMARY KEY不仅是唯一的约束,而且它还暗示该列为NOT NULL。它用于为每一行提供一个标识。这对于通过外键约束连接另一个表非常有用。虽然一个表不需要有PRIMARY KEY,但这通常是一个好主意。
主键和唯一键很相似,只是功能不同。主键使表行唯一(即不能有两个具有完全相同键的行)。一个数据库表中只能有一个主键。
唯一键使表行中的表列是唯一的(即,没有两个表行可能具有完全相同的值)。您可以有多个唯一键表列(不像主键,这意味着表中只有一个表列是唯一的)。
INDEX还创建唯一性。MySQL(示例)将为被索引的列创建索引表。这样,在对索引表列查询查询时,更容易检索表行值。缺点是,如果你做很多更新/删除/创建,MySQL必须管理索引表(这可能是一个性能瓶颈)。
希望这能有所帮助。
主键用于处理不同的表。这是关系数据库的基础。如果你有一个图书数据库,最好创建2个表- 1)图书和2)作者,INT主键“id”。然后在books中使用id而不是作者的名字。
如果不希望有重复的条目,则使用唯一键。例如,您可能在图书表中有标题,并希望确保每个标题只有一个条目。
推荐文章
- 我如何得到“id”后插入到MySQL数据库与Python?
- MySQL工作台:如何保持连接活动
- 'create_date'时间戳字段的默认值无效
- 在表变量上创建索引
- 我可以从一个完整的mysql mysqldump文件恢复一个表吗?
- 计数在VARCHAR字段中字符串的出现次数?
- 修改一个MySQL列为AUTO_INCREMENT
- 如何删除数组元素,然后重新索引数组?
- 在ROR迁移期间,将列类型从Date更改为DateTime
- 如何删除所有MySQL表从命令行没有DROP数据库权限?
- 从主机连接到docker容器中的mysql
- 如果任何字段包含NULL, MySQL CONCAT将返回NULL
- MySQL中的字符串连接
- Laravel未知列'updated_at'
- MySQL更新内部连接表查询