一 字段的约束条件
控制如何给字段赋值
Null | Key | Default | Extra |
Null : 是否允许为空 默认为yes
Key : MySQL 键值
Default:当插入数值时,不插入数据时的默认值
EXtra:额外设置,自动增长
1.1 Null和Default的使用
#创建表结构db2.t7,健表过程中使用约束条件
mysql> use db2;
mysql> create table t7(
-> name char(15) not null,
-> age tinyint unsigned default 25,
-> class char(9) not null default "nsd1904",
-> sex enum("man","woman") default "man",
-> pay float(7,2) default 28000
-> );
mysql> desc t7;
+-------+---------------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+----------+-------+
| name | char(15) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 25 | |
| class | char(9) | NO | | nsd1904 | |
| sex | enum('man','woman') | YES | | man | |
| pay | float(7,2) | YES | | 28000.00 | |
+-------+---------------------+------+-----+----------+-------+
5 rows in set (0.00 sec)
mysql>
#使用默认值赋值的方法给表中字段赋值
#赋值时有default的字段,如果没有指定数值则会使用默认值
mysql> insert into t7(name) values("bob");
Query OK, 1 row affected (0.11 sec)
mysql> select * from t7;
+------+------+---------+------+----------+
| name | age | class | sex | pay |
+------+------+---------+------+----------+
| bob | 25 | nsd1904 | man | 28000.00 |
+------+------+---------+------+----------+
1 row in set (0.01 sec)
mysql>
#注意:赋空值与不赋值是不一样的
#空值的值是NULL
#不赋值时使用默认值default
mysql> insert into t7 values("jerry",NULL,"NSD1905","man",3800);
Query OK, 1 row affected (0.09 sec)
mysql> insert into t7(name,class,sex,pay) values("xixi","NSD1905","man",8000);
Query OK, 1 row affected (0.09 sec)
mysql> select * from db2.t7;
+-------+------+---------+------+----------+
| name | age | class | sex | pay |
+-------+------+---------+------+----------+
| bob | 25 | nsd1904 | man | 28000.00 |
| jerry | NULL | NSD1905 | man | 3800.00 |
| xixi | 25 | NSD1905 | man | 8000.00 |
+-------+------+---------+------+----------+
3 rows in set (0.00 sec)
mysql>
1.2 Extra:自动增长 auto_increment
它必须和主键一起使用才生效
#创建db2.t6表,把Id设置为主键并设置自动增长
mysql> use db2;
mysql> create table t6(
-> id int primary key auto_increment,
-> name char(10),
-> age int,
-> sex enum("w","m")
-> );
mysql> desc t6;
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | enum('w','m') | YES | | NULL | |
+-------+---------------+------+-----+---------+----------------+
#第一次添加记录时,自增长是0+1,后续记录的id值会自动增长
mysql> insert into t6(name,age,sex)values("bob",19,"m");
mysql> insert into t6(name,age,sex)values("tom",21,"m");
mysql> select * from t6;
+----+------+------+------+
| id | name | age | sex |
+----+------+------+------+
| 1 | bob | 19 | m |
| 2 | tom | 21 | m | #第二条记录的ID会自动增长为2
+----+------+------+------+
#后续再增加记录时,如果不想使用id为3,则可以手动指令ID的值
#只要不和已有冲突且是增加的即可
mysql> insert into t6 values(6,"alice",21,"m")
mysql> delete from t6; #清空表记录
mysql> select * from t6;
#再次使用自动增加时,它会以清除之的最后一个id值6开始自动
#增长而不是重新从0开始
1.3 MySQL 键值类型 -
键值的作用是为了字段赋值时做限制的,根据数据存储要求来决定要不要用键值,用什么类型的键值。
因为是对字段做限制的,所以这个键值是要放在字段上的。
index 普通索引
unique 唯一索引 不常用
fulltext 全文索引 不常用
primary key 主键
foreign key 外键
1.3.1 普通索引 使用索引的主机目的是:提高查询数据的速度。
优点:
通过创建索引,可以保证数据库中第一行数的唯一可以加快数据的查询速度
缺点:
对表中数据进行增 删 改的时候,索引也要跟着调整,降低了维护速度占用物理空间
使用规则:
一个表中可以有多个index字段;
字段的值可以重复,也可以NULL;
通常把做为查询条件的字段为index字段;
index标志是MUL
----------------------------------------------------------------------------------
(1)建表的时候创建索引
使用index()函数,如果没有指定索引的名字,那么索引名同字段名。
#创建表tea4,同时指定索引name,id
mysql> create table tea4(
-> id int,
-> name char(1),
-> class char(9),
-> pay float,
-> index(name),index(id)
-> );
mysql> desc tea4; #查看索引的标志
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| name | char(1) | YES | MUL | NULL | |
| class | char(9) | YES | | NULL | |
| pay | float | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
mysql> show index from tea4G; #查看索引的详细信息
*************************** 1. row **************
Table: tea4 #表名
Non_unique: 1
Key_name: name #索引名
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE #二叉树算法
Comment:
Index_comment: ------------------------------------------------------------------------
(2)在已有表中建索引
mysql> create index xxx on t7(name); #在t7表中为name字段创建一个名为xxx的索引
mysql> create index age on t7(age); #索引名和字段同名
(3)删除索引
#删除t7表中名字为xxx的索引
mysql> drop index xxx on t7;
mysql> drop index age on t7;
(4)查看索引:
删除索引之前如果不知道索引的名字需要先查询索引
mysql> show index from 表名G;
(5)验证查询数据时是否使用了索引:
explain select * from 表名 where 字段="值"
========================================================================
1.3.2 primary key 主键
使用规则:
字段不允许重复,且不允许为NULL;
一个表中只能有一个primary key;
如果要使多个字段都作为主键,可以用复合主键,必须一起创建;
通常会把表中唯一标识记录的字段设置为主键,一般用行号ID;
主键通常与auto_increment连用,让字段使用自增长方式赋值;
主键标志PRI;
------------------------------------------------------------------------
(1)建表的时候同时创建主键
一旦指定为主键,该字段就自动为能为NULL
mysql> use db2;
mysql> create table t8(
-> name char(10) primary key,
-> id int
-> );
mysql> desc t8;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | NO | PRI | NULL | |
| id | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
--------------------------------------------------------------------------
(2)在已有表中创建主键
#在t7表中把class字段添加为主键
mysql> alter table t7 add primary key (class);
(3)删除主键
mysql> alter table t7 drop primary key;
--------------------------------------------------------------
(4)复合主键(多个字段一起做主键)
多个字段一起做主键,字段的值不同时重复就可以,复合主键必须一起创建;
主键要一起创建,只有全部主键字段内容全部重复时,才算重复.
使用场景:两个字段中的任意字段数值可以重复,但两个字段的数值加起来必须唯一,
比如:端口号+IP地址,姓名+班级。
#在t5表中把字段name,class一起创建复合主键,
mysql> create table t5(
-> name char(10),
-> class char(7),
-> status enum("yes","no"),
-> primary key(name,class)
-> );
mysql> desc t5;
+--------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+-------+
| name | char(10) | NO | PRI | NULL | |
| class | char(7) | NO | PRI | NULL | |
| status | enum('yes','no') | YES | | NULL | |
+--------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
mysql> select * from t5;
+------+---------+--------+
| name | class | status |
+------+---------+--------+
| bob | nsd1904 | yes |--->
| bob | nsd1906 | no |---> #不同时重复不算重复,可以存储成功.
| tom | nsd1904 | yes |
+------+---------+--------+
3 rows in set (0.00 sec)
mysql>
=========================================================================
1.3.3 foreign key 外键
作用:
外键也是约束给字段赋值的;
插入记录时,字段的值在另一个表字段值范围内选择;
使用规则:
两个表的存储引擎必须是innodb;
两个字段类型要一致;
被参照字段必须要是索引类型的一种(通常是primary key)
------------------------------------------------------------------------------
#先创建员工信息表yginfo,id字段使用自动增长。
mysql> create table yginfo(
-> yg_id int primary key auto_increment,
-> name char(20)
-> )engine=innodb;
mysql> insert into yginfo(name) values("bob");
mysql> insert into yginfo(name) values("alice");
mysql> insert into yginfo(name) values("tom");
mysql> select * from yginfo;
+-------+-------+
| yg_id | name |
+-------+-------+
| 1 | bob |
| 2 | alice |
| 3 | tom |
+-------+-------+
(1) 创建工资表,同时创建外键
#创建gzb表,其中gz_id做为外键,该外键参考yginfo表中
#的yg_id
mysql> create table gzb(
-> gz_id int,
-> pay float(7,2),
-> foreign key(gz_id) references yginfo(yg_id)
-> on update cascade
-> on delete cascade
-> )engine=innodb;
(2) 查看这个表中是否有外键:
mysql> show create table gzb G;
*************************** 1. row ***************************
Table: gzb #表名
Create Table: CREATE TABLE `gzb` (
`gz_id` int(11) DEFAULT NULL,
`pay` float(7,2) DEFAULT NULL,
KEY `gz_id` (`gz_id`),
CONSTRAINT `gzb_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES
#外键字段的外键名称是 gzb_ibfk_1
`yginfo` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
(3)外键的同步更新:
mysql> select * from gzb;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 1 | 50000.00 |
| 2 | 40000.00 |
| 3 | 30000.00 |
+-------+----------+
#更新yginfo中的yg_id时,那么gbz中的yz_id也会变化
mysql> update yginfo set yg_id=8 where yg_id=2;
mysql> select * from gzb;;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 1 | 50000.00 |
| 8 | 40000.00 | #2已更新为8
| 3 | 30000.00 |
+-------+----------+
(4)外键的同步删除:
#删除yginfo表中的yg_id=3的记录时,gzb中的相关联的记录
#也会自动删除
mysql> delete from yginfo where yg_id=3;
mysql> select * from gzb;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 1 | 50000.00 |
| 8 | 40000.00 |
+-------+----------+
----------------------------------------------------------------------------------
(5)删除外键:
alter table 表名 drop foreign key 外键名;
#删除gzb中的外键,使它不再受yginfo表中数据的约束
mysql> alter table gzb drop foreign key gzb_ibfk_1;
mysql> show create table gzbG;
*************************** 1. row *****************
Table: gzb
Create Table: CREATE TABLE `gzb` (
`gz_id` int(11) DEFAULT NULL,
`pay` float(7,2) DEFAULT NULL,
KEY `gz_id` (`gz_id`)
#外键信息已删除
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)