mysql中key 、primary key 、unique key 与index区别
mysql中索引是非常重要的知识点,相比其他的知识点,索引更难掌握,并且mysql中的索引种类也有很多,比如primarykey、uniquekey与index等等,本文章向大家介绍mysql中key、primarykey、uniquekey与index区别。
一、key与primarykey区别
CREATETABLEwh_logrecord( logrecord_idint(11)NOTNULLauto_increment, user_namevarchar(100)defaultNULL, operation_timedatetimedefaultNULL, logrecord_operationvarchar(100)defaultNULL, PRIMARYKEY(logrecord_id), KEYwh_logrecord_user_name(user_name) )
解析:
KEYwh_logrecord_user_name(user_name)
本表的user_name字段与wh_logrecord_user_name表user_name字段建立外键
括号外是建立外键的对应表,括号内是对应字段
类似还有KEYuser(userid)
当然,key未必都是外键
总结:
Key是索引约束,对表中字段进行约束索引的,都是通过primaryforeignunique等创建的。常见有foreignkey,外键关联用的。
KEYforum(status,type,displayorder) #是多列索引(键)
KEYtid(tid) #是单列索引(键)。
如建表时:KEYforum(status,type,displayorder)
select*fromtablegroupbystatus,type,displayorder是否就自动用上了此索引,
而当select*fromtablegroupbystatus此索引有用吗?
key的用途:主要是用来加快查询速度的。
二、KEY与INDEX区别
批注:这部分我仍云里雾里。
KEY通常是INDEX同义词。如果关键字属性PRIMARYKEY在列定义中已给定,则PRIMARYKEY也可以只指定为KEY。这么做的目的是与其它数据库系统兼容。PRIMARYKEY是一个唯一KEY,此时,所有的关键字列必须定义为NOTNULL。如果这些列没有被明确地定义为NOTNULL,MySQL应隐含地定义这些列。一个表只有一个PRIMARYKEY。
MySQL中Index与Key的区别
Key即键值,是关系模型理论中的一部份,比如有主键(PrimaryKey),外键(ForeignKey)等,用于数据完整性检否与唯一性约束等。而Index则处于实现层面,比如可以对表个的任意列建立索引,那么当建立索引的列处于SQL语句中的Where条件中时,就可以得到快速的数据定位,从而快速检索。至于UniqueIndex,则只是属于Index中的一种而已,建立了UniqueIndex表示此列数据不可重复,猜想MySQL对UniqueIndex类型的索引可以做进一步特殊优化吧。
于是乎,在设计表的时候,Key只是要处于模型层面的,而当需要进行查询优化,则对相关列建立索引即可。
另外,在MySQL中,对于一个PrimaryKey的列,MySQL已经自动对其建立了UniqueIndex,无需重复再在上面建立索引了。
搜索到的一段解释:
Notethat“primary”iscalledPRIMARYKEYnotINDEX.
KEYissomethingonthelogicallevel,describesyourtableanddatabasedesign(i.e.enforcesreferentialintegrity…)
INDEXissomethingonthephysicallevel,helpsimproveaccesstimefortableoperations.
BehindeveryPKthereis(usually)uniqueindexcreated(automatically).
三、mysql中UNIQUEKEY和PRIMARYKEY有什么区别
1,Primarykey的1个或多个列必须为NOTNULL,如果列为NULL,在增加PRIMARYKEY时,列自动更改为NOTNULL。而UNIQUEKEY对列没有此要求
2,一个表只能有一个PRIMARYKEY,但可以有多个UNIQUEKEY
3,主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。
altertabletaddconstraintuk_t_1unique(a,b); insertintot(a,b)values(null,1);#不能重复 insertintot(a,b)values(null,null);#可以重复
四、使用UNIQUEKEY
CREATETABLE`secure_vulnerability_warning`( `id`int(10)NOTNULLauto_increment, `date`dateNOTNULL, `type`varchar(100)NOTNULL, `sub_type`varchar(100)NOTNULL, `domain_name`varchar(128)NOTNULL, `url`textNOTNULL, `parameters`textNOTNULL, `hash`varchar(100)NOTNULL, `deal`int(1)NOTNULL, `deal_date`datedefaultNULL, `remark`text, `last_push_time`datetimedefaultNULL, `push_times`int(11)default'1', `first_set_ok_time`datetimedefaultNULL, `last_set_ok_time`datetimedefaultNULL, PRIMARYKEY(`id`), UNIQUEKEY`date`(`date`,`hash`) )ENGINE=InnoDBDEFAULTCHARSET=utf8
UNIQUEKEY的用途:主要是用来防止数据插入的时候重复的。
1,创建表时
CREATETABLEPersons ( Id_PintNOTNULL, LastNamevarchar(255)NOTNULL, FirstNamevarchar(255), Addressvarchar(255), Cityvarchar(255), UNIQUE(Id_P) )
如果需要命名UNIQUE约束,以及为多个列定义UNIQUE约束,请使用下面的SQL语法:
CREATETABLEPersons ( Id_PintNOTNULL, LastNamevarchar(255)NOTNULL, FirstNamevarchar(255), Addressvarchar(255), Cityvarchar(255), CONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName) )
2,当表已被创建时,如需在"Id_P"列创建UNIQUE约束,请使用下列SQL:
ALTERTABLEPersons
ADDUNIQUE(Id_P)
如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法:
ALTERTABLEPersons
ADDCONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName)
3,撤销UNIQUE约束
如需撤销UNIQUE约束,请使用下面的SQL:
MySQL:
ALTERTABLEPersons
DROPINDEXuc_PersonID
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!