mysql创建多列组合唯一索引,uniqueindex

更新时间:2023-07-07 17:02:04 阅读: 评论:0

mysql 创建多列组合唯⼀索引,uniqueindex
CREATE TABLE IF NOT EXISTS `pprver`.`eventTable`(
`urId`        INT UNSIGNED      NOT null,
`taskId`        INT UNSIGNED      NOT null,treasure什么意思
`date`          TIMESTAMP        DEFAULT CURRENT_TIMESTAMP,
`createTime`    TIMESTAMP        DEFAULT CURRENT_TIMESTAMP,
`endTime`        TIMESTAMP        DEFAULT CURRENT_TIMESTAMP,
`taskStatus`    INT              DEFAULT NULL,
`addGoldCoin`    int              DEFAULT NULL,
`addCash`        FLOAT            DEFAULT NULL,
`eventId`        INT UNSIGNED AUTO_INCREMENT DEFAULT null,
unique index(`urId` ,`taskId`,`date`),
PRIMARY KEY ( `eventId`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
例⼦⼆:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)
索引被⽤来快速找出在⼀个列上⽤⼀特定值的⾏。没有索引,不得不⾸先以第⼀条记录开始并然后读完整个表直到它找出相关的⾏。
表越⼤,花费时间越多。如果表对于查询的列有⼀个索引,能快速到达⼀个位置去搜寻到数据⽂件的中间,没有必要考虑所有数据。
如果⼀个表有1000⾏,这⽐顺序读取⾄少快100倍。注意你需要存取⼏乎所有1000⾏,它较快的顺序读取,因为此时我们避免磁盘寻道。
所有的MySQL 索引(PRIMARY 、UNIQUE 和INDEX)在B 树中存储。字符串是⾃动地压缩前缀和结尾空间。
索引⽤于:
快速找出匹配⼀个WHERE ⼦句的⾏;
当执⾏联结时,从其他表检索⾏;
爸爸去哪儿英文版
对特定的索引列找出MAX()或MIN()值;
如果排序或分组在⼀个可⽤键的最左⾯前缀上进⾏(例如,ORDER BY key_part_1,key_part_2),排序或分组⼀个表。
如果所有键值部分跟随DESC ,键以倒序被读取。
在⼀些情况中,⼀个查询能被优化来检索值,不⽤咨询数据⽂件。
如果对某些表的所有使⽤的列是数字型的并且构成某些键的最左⾯前缀,为了更快,值可以从索引树被检索出来。
—————————————————————————————————————————————————————————————————————————————下⾯是建表的语句:
最后⼀句的KEY `type` (`type`)是什么意思?
如果只是key 的话,就是普通索引。
mysql 的key 和index 多少有点令⼈迷惑,单独的key 和其它关键词结合的key(primary key)实际表⽰的意义是不同,这实际上考察对体系结构的了解的。1 :
key 是的物理结构,它包含两层意义和作⽤,
⼀是约束(偏重于约束和规范数据库的结构完整性),
⼆是索引(辅助查询⽤的)。
包括primary key, unique key, foreign key 等。
primary key  有两个作⽤,⼀是约束作⽤(constraint ),⽤来规范⼀个存储主键和唯⼀性,但同时也在此key 上建⽴了⼀个主键索引;
PRIMARY KEY 约束:唯⼀标识数据库表中的每条记录;
主键必须包含唯⼀的值;[sql]
01. CREATE  TABLE  `phpcolor_ad` (  02. `id` mediumint(8) NOT  NULL  AUTO_INCREMENT,  03. `name ` varchar (30) NOT  NULL ,  04. `type` mediumint(1) NOT  NULL ,  05. `code` text,  06. PRIMARY  KEY  (`id`),  07. KEY  `type` (`type`)  08. );
主键列不能包含 NULL 值;
每个表都应该有⼀个主键,并且每个表只能有⼀个主键。(PRIMARY KEY 拥有⾃动定义的 UNIQUE 约束)
unique key也有两个作⽤,⼀是约束作⽤(constraint),规范数据的唯⼀性,但同时也在这个key上建⽴了⼀个唯⼀索引;
UNIQUE 约束:唯⼀标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯⼀性的保证。
(每个表可以有多个 UNIQUE 约束,但是每个表只能有⼀个 PRIMARY KEY 约束)
foreign key也有两个作⽤,⼀是约束作⽤(constraint),规范数据的引⽤完整性,但同时也在这个key上建⽴了⼀个index;
可见,mysql的key是同时具有constraint和index的意义,这点和其他数据库表现的可能有区别。
(⾄少在上建⽴外键,不会⾃动建⽴index),因此创建key也有如下⼏种⽅式:
(1)在字段级以key⽅式建⽴,如 create table t (id int not null primary key);
(2)在表级以constraint⽅式建⽴,如create table t(id int, CONSTRAINT pk_t_id PRIMARY key (id));
(3)在表级以key⽅式建⽴,如create table t(id int, primary key (id));
其它key创建类似,但不管那种⽅式,既建⽴了constraint,⼜建⽴了index,只不过index使⽤的就是这个constraint或key。
2: index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以⼀个类似⽬录的结构存储。索引要分类的话,分为前缀索引、全⽂本索引等;
因此,索引只是索引,它不会去约束索引的字段的⾏为(那是key要做的事情)。如,create table t(id int,index inx_tx_id (id));
3 总结,最后的释疑:
(1)我们说索引分类,分为
老友有喜主键索引(必须指定为“PRIMARY KEY”,没有PRIMARY Index)、
唯⼀索引(unique index,⼀般写成unique key)、
普通索引(index,只有这⼀种才是纯粹的index)等,也是基于是不是把index看作了key。
⽐如 create table t(id int, unique index inx_tx_id (id));--index当作了key使⽤
relievos
(2)最重要的也就是,不管如何描述,需要理解index是纯粹的index(普通的key,或者普通索引index),还是被当作key(如:unique index、unique key和primary key),若当作key时则会有两种意义或起两种作⽤。—————————————————————————————————————————————————————————————————————————————MySQL Key值(PRI, UNI, MUL)的含义:
PRI主键约束;
UNI唯⼀约束;
MUL可以重复。
注:若是普通的key或者普通的index(实际上,普通的key与普通的index同义)。
当我们在desc 表名; 的时候,有⼀个Key值,表⽰该列是否含有索引
假设表结构如下所⽰
mysql> desc aa;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |    | NULL    |      |
+-------+---------+------+-----+---------+-------+
| xx    | int(11) | YES  | PRI | NULL    |      |
+-------+---------+------+-----+---------+-------+
| yy    | int(11) | YES  | UNI | NULL    |      |
米奇妙妙屋英文全集+-------+---------+------+-----+---------+-------+
| zz    | int(11) | YES  | MUL | NULL    |      |
fairytale什么意思+-------+---------+------+-----+---------+-------+
1 row in t (0.00 c)
我们看到Key那⼀栏,可能会有4种值,即'啥也没有','PRI','UNI','MUL'
1. 如果Key是空的, 那么该列值的可以重复,表⽰该列没有索引, 或者是⼀个⾮唯⼀的复合索引的⾮前导列
2. 如果Key是PRI,  那么该列是主键的组成部分
3. 如果Key是UNI,  那么该列是⼀个唯⼀值索引的第⼀列(前导列),且不能含有空值(NULL)
4. 如果Key是MUL,  那么该列的值可以重复, 该列是⼀个⾮唯⼀索引的前导列(第⼀列)或者是⼀个唯⼀性索引的组成部分但是可以含有空值NULL
注:
1、如果对于⼀个列的定义,同时满⾜上述4种情况的多种,⽐如⼀个列既是PRI,⼜是UNI(如果是PRI,则⼀定是UNI)
那么"desc 表名"; 的时候,显⽰的Key值按照优先级来显⽰ PRI->UNI->MUL
那么此时,显⽰PRI。
2、如果某列不能含有空值,同时该表没有主键,则⼀个唯⼀性索引列可以显⽰为PRI,
3、如果多列构成了⼀个唯⼀性复合索引,那么⼀个唯⼀性索引列可以显⽰为MUL。(因为虽然索引的多列组合是唯⼀的,⽐如ID+NAME是唯⼀的,但是每⼀个单独的列依然可以有重复的值,因为只要ID+NAME是唯⼀的即可)
⼀、key与primary key区别
⼀、key 与primary key 区别
解析:
KEY wh_logrecord_ur_name (ur_name)
本表的ur_name 字段与wh_logrecord_ur_name 表ur_name 字段建⽴外键
括号外是建⽴外键的对应表,括号内是对应字段
类似还有 KEY ur(urid) 当然,key 未必都是外键
总结:
Key 是索引约束,对表中字段进⾏约束索引的,都是通过primary foreign unique 等创建的。常见有foreign key ,外键关联⽤的。
KEY forum (status,type,displayorder)  # 是多列索引(键)
KEY tid (tid)                        # 是单列索引(键)。
如建表时: KEY forum (status,type,displayorder)
lect * from table group by status,type,displayorder 是否就⾃动⽤上了此索引,
⽽当 lect * from table group by status 此索引有⽤吗?
key 的⽤途:主要是⽤来加快查询速度的。
主键,两个列组合在⼀起,是唯⼀的,内建唯⼀性索引,并且不能为NULL
另外,两个Key 定义,相当于分别对这两列建⽴索引。
innodb
primary key  主键聚集索引
key 普通索引conceptual
⼆、KEY 与INDEX 区别
KEY 通常是INDEX 同义词。如果关键字属性PRIMARY KEY 在列定义中已给定,则PRIMARY KEY 也可以只指定为KEY 。
这么做的⽬的是与其它数据库系统兼容。
绯闻女孩是谁PRIMARY KEY 是⼀个唯⼀KEY ,此时,所有的关键字列必须定义为NOT NULL 。
如果这些列没有被明确地定义为NOT NULL ,MySQL 应隐含地定义这些列。⼀个表只有⼀个PRIMARY KEY 。
MySQL 中Index 与Key 的区别
Key 即键值,是关系模型理论中的⼀部份,⽐如有主键(Primary Key),外键(Foreign Key )等,⽤
于数据完整性检否与唯⼀性约束等。
⽽Index 则处于实现层⾯,⽐如可以对表的任意列建⽴索引,那么当建⽴索引的列处于SQL 语句中的Where 条件中时,就可以得到快速的数据定位,从⽽快速检索。⾄于Unique Index ,则只是属于Index 中的⼀种⽽已,建⽴了Unique Index 表⽰此列数据不可重复,猜想MySQL 对Unique Index 类型的索引可以做进⼀步特殊优化吧。 于是乎,在设计表的时候,Key 只是要处于模型层⾯的,⽽当需要进⾏查询优化,则对相关列建⽴索引即可。
另外,在MySQL 中,对于⼀个Primary Key 的列,MySQL 已经⾃动对其建⽴了Unique Index ,⽆需重复再在上⾯建⽴索引了。
搜索到的⼀段解释:
Note that “primary” is called PRIMARY KEY not INDEX.
KEY is something on the logical level , describes your table and databa design (i.e. enforces referential integrity …)
INDEX is something on the physical level , helps improve access time for table operations.
Behind every PK there is (usually) unique index created (automatically). [sql]
01. CREATE  TABLE  wh_logrecord (  02. logrecord_id int (11) NOT  NULL  auto_increment,  03. ur_name varchar (100) default  NULL ,  04. operation_time datetime default  NULL ,  05. logrecord_operation varchar (100) default  NULL ,  06. PRIMARY  KEY  (logrecord_id),  07. KEY  wh_logrecord_ur_name (ur_name)  08. )
[sql]
01. CREATE  TABLE  `admin_role` (  02.  `adminSet_id` varchar (32) NOT  NULL ,  03.  `roleSet_id` varchar (32) NOT  NULL ,  04.  PRIMARY  KEY  (`adminSet_id`,`roleSet_id`),  05.  KEY  `FK9FC63FA6DAED032` (`adminSet_id`),  06.  KEY  `FK9FC63FA6C7B24C48` (`roleSet_id`)  07. ) ENGINE=InnoDB DEFAULT  CHARSET=utf8;
Behind every PK there is (usually) unique index created (automatically).
三、mysql 中UNIQUE KEY 和PRIMARY KEY 有什么区别
1,Primary key 的1个或多个列必须为NOT NULL ,如果列为NULL ,在增加PRIMARY KEY 时,列⾃动更改为NOT NULL 。⽽UNIQUE KEY 对列没有此要求
2,⼀个表只能有⼀个PRIMARY KEY ,但可以有多个UNIQUE KEY
3,主键和唯⼀键约束是通过参考索引实施的,如果插⼊的值均为NULL ,则根据索引的原理,全NULL 值不被记录在索引上,所以插⼊全NULL 值时,可以有重复的,⽽其他的则不能插⼊重复值。 alter table t add constraint uk_t_1 unique (a,b);
inrt into t (a ,b ) values (null,1);    # 不能重复
inrt into t (a ,b ) values (null,null);#可以重复
四、使⽤UNIQUE KEY拆除英语
UNIQUE KEY 的⽤途:主要是⽤来防⽌数据插⼊的时候重复的。
1,创建表时什么是动名词
如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使⽤下⾯的 SQL 语法:
2,当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使⽤下列 SQL :
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使⽤下⾯的 SQL 语法:
3,撤销 UNIQUE 约束 [sql]
01. CREATE  TABLE  `cure_vulnerability_warning` (  02.  `id` int (10) NOT  NULL  auto_increment,  03.  `date ` date  NOT  NULL ,  04.  `type` varchar (100) NOT  NULL ,  05.  `sub_type` varchar (100) NOT  NULL ,  06.  `domain_name` varchar (128) NOT  NULL ,  07.  `url` text NOT  NULL ,  08.  `parameters` text NOT  NULL ,  09.  `hash` varchar (100) NOT  NULL ,  10.  `deal` int (1) NOT  NULL ,  11.  `deal_date` date  default  NULL ,  12.  `remark` text,  13.  `last_push_time` datetime default  NULL ,  14.  `push_times` int (11) default  '1',  15.  `first_t_ok_time` datetime default  NULL ,  16.  `last_t_ok_time` datetime default  NULL ,  17.  PRIMARY  KEY  (`id`),  18.  UNIQUE  KEY  `date ` (`date `,`hash`)  19. ) ENGINE=InnoDB  DEFAULT  CHARSET=utf8
[sql]
01. CREATE  TABLE  Persons  02. (  03. Id_P int  NOT  NULL ,  04. LastName varchar (255) NOT  NULL ,  05. FirstName varchar (255),  06. Address varchar (255),  07. City varchar (255),  08. UNIQUE  (Id_P)  09. )
[sql]
01. CREATE  TABLE  Persons  02. (  03. Id_P int  NOT  NULL ,  04. LastName varchar (255) NOT 
NULL ,  05. FirstName varchar (255),  06. Address varchar (255),  07. City varchar (255),  08. CONSTRAINT  uc_PersonID UNIQUE  (Id_P,LastName)  09. )
[sql]
01. ALTER  TABLE  Persons  02. ADD  UNIQUE  (Id_P)
[sql]
01. ALTER  TABLE  Persons  02. ADD  CONSTRAINT  uc_PersonID UNIQUE  (Id_P,LastName)
如需撤销 UNIQUE 约束,请使⽤下⾯的 SQL:
[sql]
01. ALTER TABLE Persons
02. DROP INDEX uc_PersonID

本文发布于:2023-07-07 17:02:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/170145.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:约束   数据   主键   数据库   查询   结构   定义   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图