MySQL键值
MySQL键值概述
键值类型
- 根据数据存储要求,选择键值
- index 普通索引
- uniaue 唯一索引
- fulltext 全文索引
- primary key 主键
- foreign key 外键
索引介绍
索引是什么?
-类似于书的目录
-对表中字段值进行排序。
-索引类型包括:Btree、B+ tree . hash

索引优缺点
索引优点
- -通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- -可以加快数据的查询速度
索引缺点
- -当对表中的数据进行增加、删除和修改的时候,索引也要动态的调整,降低了数据的维护速度
- -索引需要占物理空间
MySQL键值使用
index普通索引
使用规则
- -一个表中可以有多个index字段
- -字段的值允许重复,且可以赋NULL值
- -通常把做为查询条件的字段设置为index字段- index字段标志是MUL
建表的时创建索引
index(字段名), index(字段名).. ..

在已有的表里创建索引
create index 索引名 on 表名(字段名);
删除索引
drop index 索引名on 表名;

查看索引信息
show index from 表名\G;

案例3:index 普通索引
步骤一:索引的创建与删除
1)创建表的时候指定INDEX索引字段
创建库home:
mysql> create database home; Query OK, 1 row affected (0.00 sec)
允许有多个INDEX索引字段。比如,以下操作在home库中创建了tea4表,将其中的id、name作为索引字段:
mysql> USE home;
Database changed
mysql> CREATE TABLE tea4(
-> id char(6) NOT NULL,
-> name varchar(6) NOT NULL,
-> age int(3) NOT NULL,
-> gender ENUM('boy','girl') DEFAULT 'boy',
-> INDEX(id),INDEX(name)
-> );
Query OK, 0 rows affected (0.59 sec)
查看新建tea4表的字段结构,可以发现两个非空索引字段的KEY标志为MUL:
mysql> DESC tea4;
+--------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------+------+-----+---------+-------+
| id | char(6) | NO | MUL | NULL | |
| name | varchar(6) | NO | MUL | NULL | |
| age | int(3) | NO | | NULL | |
| gender | enum('boy','girl') | YES | | boy | |
+--------+--------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
2)删除现有表的某个INDEX索引字段
比如,删除tea4表中名称为named的INDEX索引字段:
mysql> drop INDEX name ON tea4; //删除name字段的索引
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tea4; //确认删除结果
+--------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------+------+-----+---------+-------+
| id | char(6) | NO | MUL | NULL | |
| name | varchar(6) | NO | | NULL | |
| age | int(3) | NO | | NULL | |
| gender | enum('boy','girl') | YES | | boy | |
+--------+--------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3)在已有的某个表中设置INDEX索引字段
比如,针对tea4表的age字段建立索引,名称为 nianling:
mysql> CREATE INDEX nianling ON tea4(age); //针对指定字段创建索引
Query OK, 0 rows affected (0.62 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tea4; //确认创建结果
+--------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------+------+-----+---------+-------+
| id | char(6) | NO | MUL | NULL | |
| name | varchar(6) | NO | | NULL | |
| age | int(3) | NO | MUL | NULL | |
| gender | enum('boy','girl') | YES | | boy | |
+--------+--------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
4)查看指定表的索引信息
使用SHOW INDEX 指令:
mysql> SHOW INDEX FROM tea4\G
*************************** 1. row ***************************
Table: tea4
Non_unique: 1
Key_name: id
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE //使用B树算法
Comment:
Index_comment:
*************************** 2. row ***************************
Table: tea4
Non_unique: 1
Key_name: nianling //索引名称
Seq_in_index: 1
Column_name: age //字段名称
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.30 sec)
Mysql>
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
primary key主键
使用规则
- 字段值不允许重复,且不允许赋NULL值
- 一个表中只能有一个primary key字段
- 多个字段都作为主键,称为复合主键,必须一起创建,-主键字段的标志是PRI
- -主键通常与auto_increment 连用
- -通常把表中唯一标识记录的字段设置为主键[记录编号字段]
建表时创建主键
primary key(字段名)
mysql> create table t8 (
->name char(3) primary key,-> id int
->);

·在已有表里添加主键
- alter table 表名 add primary key(字段名);
删除主键
- alter table 表名 drop primary key;

创建复合主键
- alter table表名add primary key(字段名列表);

auto_increment连用

案例4:primary key 主键
步骤一:练习主键的使用
1)建表时设置PRIMARY KEY主键索引
Mysql> create database db2;
mysql> CREATE TABLE db2.biao01(
-> id int(4) PRIMARY KEY, //直接在字段定义时约束
-> name varchar(8)
-> );
Query OK, 0 rows affected (0.19 sec)
或者:
mysql> CREATE TABLE db2.biao02(
-> id int(4),
-> name varchar(8),
-> PRIMARY KEY(id) //所有字段定义完,最后指定
-> );
Query OK, 0 rows affected (0.17 sec)
在建表的时候,如果主键字段为int类型,还可以为其设置AUTO_INCREMENT自增属性,这样当添加新的表记录时,此字段的值会自动从1开始逐个增加,无需手动指定。比如,新建一个tea6表,将id列作为自增的主键字段:
mysql> CREATE TABLE db2.tea6(
-> id int(4) AUTO_INCREMENT,
-> name varchar(4) NOT NULL,
-> age int(2) NOT NULL,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.29 sec)
2)删除现有表的PRIMARY KEY主键索引
如果要移除某个表的PRIMARY KEY约束,需要通过ALTER TABLE指令修改。比如,以下操作将清除biao01表的主键索引。
清除前(主键为id):
mysql> DESC db2.biao01; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(4) | NO | PRI | NULL | | | name | varchar(8) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
清除操作:
mysql> ALTER TABLE db2.biao01 DROP PRIMARY KEY; Query OK, 0 rows affected (0.49 sec) Records: 0 Duplicates: 0 Warnings: 0
清除后(无主键):
mysql> DESC db2.biao01; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(4) | NO | | NULL | | | name | varchar(8) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
当尝试删除tea6表的主键时,会出现异常:
mysql> ALTER TABLE tea6 DROP PRIMARY KEY; ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
这是因为tea6表的主键字段id具有AUTO_INCREMNET自增属性,提示这种字段必须作为主键存在,因此若要清除此主键必须先清除自增属性——修改id列的字段定义:
mysql> ALTER TABLE tea6 MODIFY id int(4) NOT NULL; Query OK, 0 rows affected (0.75 sec) Records: 0 Duplicates: 0 Warnings: 0
然后再清除主键属性就OK了:
mysql> ALTER TABLE tea6 DROP PRIMARY KEY; //清除主键 Query OK, 0 rows affected (0.39 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc tea6; //确认清除结果 +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(4) | NO | | NULL | | | name | varchar(4) | NO | | NULL | | | age | int(2) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
3)为现有表添加PRIMARY KEY主键索引
重新为tea6表指定主键字段,仍然使用id列:
mysql> ALTER TABLE tea6 ADD PRIMARY KEY(id); //设置主键字段 Query OK, 0 rows affected (0.35 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tea6; //确认设置结果 +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(4) | NO | PRI | NULL | | | name | varchar(4) | NO | | NULL | | | age | int(2) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
4)建表时创建复合主键
mysql>
mysql> create table db2.t6(
-> class char(7),
-> name char(15),
-> pay enum("yes","no") default "no",
-> primary key(class,name,pay) //指定多个字段一起做主键
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> desc db2.t6;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| class | char(7) | NO | PRI | | |
| name | char(15) | NO | PRI | | |
| pay | enum('yes','no') | NO | PRI | no | |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql>
foreign key外键
外键功能
-插入记录时,字段值在另一个表字段值范围内选择。
使用规则
-表存储引擎必须是innodb
-字段类型要一致
–被参照字段必须要是索引类型的一种(primary key)
·创建外键
- create table 表名(
字段名列表,
foreign key(字段名) references表名(字段名) 指定外键
on update cascade 同步更新
on delete cascade 同步删除
)engine=innodb; 指定存储引擎
删除外键
- alter table 表名 drop f oreign key 外键名;

案例5 : foreign key外键
具体要求如下:
- 创建员工表yg 如表-1所示
- 创建工资表gz如表-2所示 ,并设置外键实现同步更新与同步删除
- 测试外键
- 删除外键

步骤一:创建外键
1)创建yg表,用来记录员工工号、姓名,其中yg_id列作为主键,并设置自增属性
mysql> CREATE TABLE yg(
-> yg_id int primary key AUTO_INCREMENT,
-> name char(16)
-> )engine=innodb;
Query OK, 0 rows affected (0.15 sec)
Mysql>
2)创建gz表,用来记录员工的工资信息
其中gz_id需要参考员工工号,即gz表的gz_id字段设为外键,将yg表的yg_id字段作为参考键:
mysql> CREATE TABLE gz(
-> gz_id int,
-> name char(16) ,
-> gz float(7,2) ,
-> FOREIGN KEY(gz_id) REFERENCES yg(yg_id) //创建外键
-> ON UPDATE CASCADE ON DELETE CASCADE //同步更新、同步删除
-> )engine=innodb;
Query OK, 0 rows affected (0.23 sec)
Mysql>
3)为yg表添加2条员工信息记录
因yg_id有AUTO_INCREMENT属性,会自动填充,所以只要为name列赋值就可以了。
插入表记录可使用INSERT指令,这里先执行下列操作,具体在下一章学习:
mysql> INSERT INTO yg(name) VALUES('Jerry'),('Tom');
Query OK, 2 rows affected (0.16 sec)
Records: 2 Duplicates: 0 Warnings: 0
确认yg表的数据记录:
mysql> SELECT * FROM yg; +-------+-------+ | yg_id | name | +-------+-------+ | 1 | Jerry | | 2 | Tom | +-------+-------+ 2 rows in set (0.00 sec)
4)为gz表添加2条工资信息记录
同上,数据参考图-2,插入相应的工资记录(gz_id字段未指定默认值,也未设置自增属性,所以需要手动赋值):
mysql> INSERT INTO gz(gz_id,name,gz)
-> VALUES(1,'Jerry',12000),(2,'Tom',8000)
-> ;
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
确认gz表的数据记录:
mysql> SELECT * FROM gz; +-------+-------+----------+ | gz_id | name | gz | +-------+-------+----------+ | 1 | Jerry | 12000.00 | | 2 | Tom | 8000.00 | +-------+-------+----------+ 2 rows in set (0.05 sec)
5)验证表记录的UPDATE更新联动
将yg表中Jerry用户的yg_id修改为1234:
mysql> update yg SET yg_id=1234 WHERE name='Jerry'; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0
确认修改结果:
mysql> SELECT * FROM yg; +-------+-------+ | yg_id | name | +-------+-------+ | 2 | Tom | | 1234 | Jerry | +-------+-------+ 2 rows in set (0.00 sec)
同时也会发现,gz表中Jerry用户的gz_id也跟着变了:
mysql> SELECT * FROM gz; +-------+-------+----------+ | gz_id | name | gz | +-------+-------+----------+ | 1234 | Jerry | 12000.00 | | 2 | Tom | 8000.00 | +-------+-------+----------+ 2 rows in set (0.00 sec)
6)验证表记录的DELETE删除联动
删除yg表中用户Jerry的记录:
mysql> DELETE FROM yg WHERE name='Jerry'; Query OK, 1 row affected (0.05 sec)
确认删除结果:
mysql> SELECT * FROM yg; +-------+------+ | yg_id | name | +-------+------+ | 2 | Tom | +-------+------+ 1 row in set (0.00 sec)
查看gz表中的变化(Jerry的记录也没了):
mysql> SELECT * FROM gz; +-------+------+---------+ | gz_id | name | gz | +-------+------+---------+ | 2 | Tom | 8000.00 | +-------+------+---------+ 1 row in set (0.00 sec)
7)删除指定表的外键约束
先通过SHOW指令获取表格的外键约束名称:
mysql> SHOW CREATE TABLE gz\G
*************************** 1. row ***************************
Table: gz
Create Table: CREATE TABLE `gz` (
`gz_id` int(4) NOT NULL,
`name` char(16) NOT NULL,
`gz` float(7,2) NOT NULL DEFAULT '0.00',
KEY `name` (`name`),
KEY `gz_id` (`gz_id`),
CONSTRAINT `gz_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yg` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
其中gz_ibfk_1即删除外键约束时要用到的名称。
删除操作:
mysql> ALTER TABLE gz DROP FOREIGN KEY gz_ibfk_1; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
确认删除结果:
mysql> SHOW CREATE TABLE gz\G
*************************** 1. row ***************************
Table: gz
Create Table: CREATE TABLE `gz` (
`gz_id` int(4) NOT NULL,
`name` char(16) NOT NULL,
`gz` float(7,2) NOT NULL DEFAULT '0.00',
KEY `name` (`name`),
KEY `gz_id` (`gz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
1 简述索引的优点与缺点?
参考答案
- 索引的优点:加快查询表记录的速度。
- 索引的缺点:会减慢写的速度(如: insert 、update ),占用物理存储空间。
2 简述普通索引与主键的约束规则。
参考答案
1)index普通索引
- 一个表中可以有多个INDEX字段
- 字段的值允许有重复,且可以赋NULL值
- 经常把做查询条件的字段设置为INDEX字段
- INDEX字段的KEY标志是MUL
2)primary key 主键
- 一个表中只能有一个primary key字段
- 对应的字段值不允许有重复,且不允许赋NULL值
- 如果有多个字段都作为PRIMARY KEY,称为复合主键,必须一起创建。
- 主键字段的KEY标志是PRI 、通常与 AUTO_INCREMENT 连用
- 经常把表中能够唯一标识记录的字段设置为主键字段[如:记录编号字段]
3 根据图-1显示,修改studentdb.stu_info表的结构,原表结构见DAY01练习的图-1。
图-1
参考答案
mysql> alter table studentdb.stuinfo add id int(2) zerofill primary key auto_increment first; mysql> create unique index stu_id on studentdb.stuinfo(stu_id); mysql> alter table studentdb.stuinfo add mail varchar(50) default "student@tedu.cn" after name; mysql> alter table studentdb.stuinfo add tel char(11) not null ,add qq varchar(11); mysql> alter table studentdb.stuinfo add pay float(7,2) not null default 18800 after sex; mysql> create index name on studentdb.stuinfo(name);
4 简述在表中创建外键字段要满足那些条件?
参考答案
foreign key 外键使用规则如下:
表的存储引擎必须是innodb
字段的数据类型要匹配
被参考的字段必须是key 中的一种 (通常使用primary key)

浙公网安备 33010602011771号