MySQL基础速成3——引擎、约束

http://t.csdnimg.cn/KiFjeicon-default.png?t=N7T8http://t.csdnimg.cn/KiFje接上一篇MySQL基础速成2——DML、DQL

目录

一、MySQL的引擎

1.1 MySQL引擎简介

 1.2 设定MySQL引擎

1.3 清空数据的区别

二、SQL约束

2.1 SQL 约束简介

2.2 主键约束 

2.3 删除主键约束

2.4 自动增长

2.5 验证逐渐约束效果

2.6 非空约束

2.7 唯一约束

2.8 默认值约束 


一、MySQL的引擎

1.1 MySQL引擎简介

MySQL有多种引擎,能执行create table、select等命令,在数据量不多时,使用任何引擎都没什么关系。

但是,在大数据开发期间,要处理海量数据,就需要来了解MySQL的多种引擎了。,MySQL的引擎在整个流程中可以说是属于汽车的发动机,有着至关重要的作用。MySQL引擎:启动器。

MySQL的引擎作用:

(1)当你使用create table语句时,该引擎用于创建表;
(2)当在你使用select语句或进行其他数据操作时,该引擎在内部处理各种命令请求;
(3)在多数时候,数据库引擎都隐藏在MySQL软件内,开发者不需要过多地关注它,但通常SQL内部数据出现问题时, 就是引擎导致的。

MySQL具有多种引擎,并且它已打包多个引擎,且都隐藏在MySQL软件中。在MySQL中,有3类引擎:

(1)InnoDB是一个可靠的事务处理引擎,但是它不支持全文搜索; [逻辑单元]
(2)MyISAM是一个性能极高的引擎,它支持全文搜索,但不支持[事务]处理; 
(3)Memory在功能等同于MyISAM,但由于数据存储在内存中,速度很快,但占用内存大,因此几乎不使用此引擎。

常见的两引擎:MyISAM 和 InnoDB。它们的区别如下:

 1.2 设定MySQL引擎

设定引擎的语法:

create table 表名(
    字段名 数据类型(长度) [约束],
    ...
) engine = 引擎名 default charset utf8;

# engine 的意思是 引擎

例如,使用命令完成:

(1)在MySQL中新建一个数据库班级db_student,并设定编码为utf8;

(2)新建一个包含姓名、年龄的学生表1,默认MySQL引擎;

(3)新建一个包含姓名、年龄的学生表2,并给数据表指定为InnoDB引擎及设定默认编码为utf8;

(4)使用查看创建表命令,观察两张表的编码及引擎信息。

########################设置引擎##################################
# 1.新建库
create database if not exists db_student charset utf8;
# 2.使用库
use db_student;
# 3.创建默认引擎的表
create table if not exists student1(
    name varchar(10),
    age int
);
# 4.创建InnoDB引擎的表   【规范标准】
# a.新建表
# b.设置引擎+判断
# c.字段
create table if not exists student2(
    name varchar(20),
    age int
) engine = InnoDB default charset utf8;
# 5.查看创建命令
show create table student1;
show create table student2;

1.3 清空数据的区别

清空数据有两种不同的方式:

# 删除数据表数据
delete from 表名;

# 销毁及删除数据表数据
truncate  [table] 表名;

delete和truncate删除表的区别:

 delete与truncate的主要区别有:

(1)delete删除数据时,是一条一条的删除数据记录,效率低;

(2)truncate删除数据时,是将整个表销毁,然后再创建一张一模一样的表,并且用auto_increment修饰的字段将重置为0重新开始计算。

 例如,使用命令完成:

(1)分别创建student、teacher表,字段包含:整型自动增长、主键的id编号、字符型的name姓名、整型的age年龄;

(2)分别给两个表添加两条数据;

(3)分别使用两种删除方式清空数据;

(4)再插入一条新数据并查询,对比数据并观察id编号效果。

##########################清空数据##############################
# 1.使用库
use db_student;
# 2.创建表student
create table if not exists student(
    id int primary key auto_increment,
    name varchar(20),
    age int
) engine = InnoDB default charset utf8;
# 3.创建表teacher
create table if not exists teacher(
    id int primary key auto_increment,
    name varchar(20),
    age int
) engine = InnoDB default charset utf8;
# 4.delete对student表操作
insert into student(name,age) values('张三',18);
insert into student(name,age) values('李四',21);

delete from student;

insert into student(name,age) values('张三222',18);
insert into student(name,age) values('李四222',21);

# 5.truncate对teacher表操作
insert into teacher(name,age) values('王五',19);
insert into teacher(name,age) values('赵六',39);

truncate table teacher;

insert into teacher(name,age) values('王五666',19);
insert into teacher(name,age) values('赵六666',39);

当要求删除大量无效数据时,优先考虑使用 truncate

二、SQL约束

2.1 SQL 约束简介

我们通过前面对表的操作已了解创建数据表语法:

create table 表名(
    字段名1 数据类型(长度) [约束],
    字段名2 数据类型(长度) [约束],
    字段名3 数据类型(长度) [约束],
    ...
) engine = 引擎名 default charset utf8;

我们会发现字段名的结尾处可以添加SQL约束。

SQL约束是用于指定字段数据的规则,可以保证数据更加精确、可靠。

通俗地说,SQL约束就是数据在类型的基础上【增加了额外要求】。

常见的SQL约束:

 对于SQL约束,要注意:

(1)SQL约束不是必须的,而是为了让SQL更加规范而存在;
(2)在学习SQL过程中,为了便于初学者更好的理解SQL约束,会单独讲解SQL约束;
(3)在实际应用中,可以对字段同时设定多个SQL约束,且都是在创建数据表时进行设定。

2.2 主键约束 

添加主键约束语法:

create table 表名(
	字段名 数据类型(长度) primary key [其他约束],
	...
) engine = 引擎名 default charset utf8;

(1)给primary key主键约束的字段设定值时,不允许出现重复值;[唯一性]

(2)主键约束列不能包含null值;[非空]

(3)每个表都应该有一个主键约束,且每个表只能有一个主键。

除了可以在数据表添加主键约束外,还可以单独添加主键约束,语法:

# 创建表后,使用alter table关键字添加主键
alter table 表名 add primary key(字段名);

例如,使用命令完成:

(1)在MySQL中新建一个数据库班级db_game1,并设定编码为utf8;

(2)在库中创建游戏表game1,有4个字段:id编号、first_name曾用名、last_name姓名、skill技能;

(3)在创建表时,给id编号添加主键约束;

(4)当建表成功后,使用desc命令查看表结构;

(5)注意:当id这一列在Key字段对应的值为PRI,则表示主键约束已经添加成功。

######################添加主键约束#################################
# 1.新建库
create database if not exists db_game charset utf8;
# 2.使用库
use db_game;
# 3.创建表:新增主键约束
# create table if not exists 【】(
#     id int,
#     first_name varchar(20),
#     last_name varchar(20),
#     skill varchar(255)
# ) engine = InnoDB default charset utf8;

create table if not exists game1(
    id int primary key,
    first_name varchar(20),
    last_name varchar(20),
    skill varchar(255)
) engine = InnoDB default charset utf8;
# 4.查看表结构
desc game1;
# 5.扩展:单独添加   student
create table if not exists student(
    id int,
    first_name varchar(20),
    last_name varchar(20),
    skill varchar(255)
) engine = InnoDB default charset utf8;
# 修改主键
alter table student add primary key(id);  # 了解
desc student;

通常情况下,当主键约束的字段为int时,还会设定自动增长auto_increment。(下一小节会介绍)

2.3 删除主键约束

当不需要主键约束时,则可以删除。

删除主键约束,语法:

# 使用alter table关键字删除主键
alter table 表名 drop primary key;

例如,使用命令完成:

(1)先在库中创建游戏表game2,有4个字段:id编号[主键约束]、first_name曾用名、last_name姓名、skill技能;

(2)删除库中的游戏表game2的主键约束;

(3)当删除成功后,使用desc命令查看表结构,观察结果;

####################删除主键约束##########################
# 1.使用库
use db_game;
# 2.创建表
create table game2(
    id int primary key,
    first_name varchar(20),
    last_name varchar(20),
    skill varchar(255)
) engine = InnoDB default charset utf8;
# 查看主键
desc game2;
# 3.删除主键约束
alter table game2 drop primary key;
# 查看表结构
desc game2;
# 4.修改为空值
alter table game2 modify id int null;

2.4 自动增长

让主键约束字段为自动增长[auto],语法:

create table 表名(
	字段名 数据类型(长度) primary key auto_increment,
	...
) engine = 引擎名 default charset utf8;

/*
说明:

(1)自动增长列的数据类型必须是整型;

(2)自动增长列必须为X键(比如主键、外键)。
*/

例如,使用命令完成:

(1)在库中创建游戏表game3,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;

(2)在创建表时,给id编号添加主键约束,整型且自动增长;

(3)给游戏表game3添加2条数据,且都不添加id值,查看数据结果;

(4)思考1:当添加数据时,给主键id传递null值,效果如何?

(5)思考2:当添加一条设定id = 10的数据后,再不给主键id传值并添加一条新数据,效果如何?

########################自动增长###################################
# 1.使用库
use db_game;
# 2.创建表:自增
create table game3(
    id int primary key auto_increment,
    first_name varchar(20),
    last_name varchar(20),
    skill varchar(255)
) engine = InnoDB default charset utf8;
# 3.添加2条数据
insert into game3(first_name,last_name,skill) values('乔峰','萧峰','背着音箱');
insert into game3(first_name,last_name,skill) values('虚竹','尊主','天山折梅手');

# 4.给id=null
insert into game3 values(null,'段誉','段誉','凌波微步');

# 5.id=10,增加数据
insert into game3(id,first_name,last_name,skill) values(10,'阿紫','阿紫','阴险');
insert into game3(first_name,last_name,skill) values('慕容复','慕容复','移花接木');

2.5 验证逐渐约束效果

当给数据字段设定了主键约束后,则:

(1)值是唯一的;unique

(2)值是非空的。not null

例如,使用命令完成:

(1)使用desc命令查看游戏表game1的表结构,观察id字段;

(2)给游戏表game1插入两条id=1的数据,观察结果;

(3)给游戏表game1插入一条id=null的数据,观察结果;

(4)思考:若要允许可以给主键约束字段添加null,且会自动设定值,该怎么做?

#######################验证主键约束的效果#########################
# 1.使用库
use db_game;
# 2.验证唯一
insert into game1 values(1,'孙猴子','孙悟空','七十二变');
# insert into game1 values(1,'孙猴子2','孙悟空','七十二变');  # 报错
# 注意
# a.建议同学们写SQL语句时, 要使用单引号把字符串内容引起来
# b.若使用双引号把字符串内容引起来后, 会显示错误, 但能正常执行SQL, 不建议
# insert into game1 values(2,"天蓬元帅","猪八戒","九齿钉耙");
# 3.验证非空
# insert into game1 values(null,'玄奘','唐僧','念紧箍咒');  # 报错

2.6 非空约束

添加非空约束,语法:

create table 表名(
	字段名 数据类型(长度) [其他约束] not null,
	...
) engine = 引擎名 default charset utf8;

当设定为非空约束后,则:

(1)not null约束强制字段不接受null值;
(2)not null约束强制字段传递数据时,必须有数值。

例如,使用命令完成:

(1)在库中创建游戏表game4,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;

(2)在创建表时,给id编号添加主键约束、整型且自动增长;

(3)给last_name姓名字段设定为非空约束;

#######################非空约束#################################
# 1.使用库
use db_game;
# 2.创建表:非空
create table game4(
    id int primary key auto_increment not null,
    first_name varchar(20),
    last_name varchar(20) not null,  # 非空
    skill varchar(255)
) engine = InnoDB default charset utf8;
# 3.传递值  --正确
insert into game4(first_name, last_name, skill) values ('卷帘大将','沙和尚','摇人');
# 4.不传值
# insert into game4(first_name, skill) values ('红孩儿','三昧真火');  # 报错
# 5.传递空值
insert into game4(first_name, last_name, skill) values ('白骨精',null,'变身');
# 结论: 给设定为非空的字段必须添加非空的数值。
desc game4;

2.7 唯一约束

当在创建表时给某字段添加唯一约束,语法:

create table 表名(
	字段名 数据类型(长度) [其他约束] unique,
	...
) engine = 引擎名 default charset utf8;

每个表可以有多个unique唯一约束,但是每个表只能有一个primary key主键约束;

设定为非空约束后,要了解:

(1)unique约束用于唯一标识数据表中的每条数据;
(2)primary key字段默认唯一;
(3)unique和primary key约束均为列提供了唯一性保证。

当给数据字段设定了唯一约束后,则:

(1)值是唯一的。

例如,使用命令完成:

(1)在库中创建游戏表game5,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;

(2)在创建表时,给id编号添加主键约束、整型且自动增长;

(3)给last_name字段设定为唯一约束;

(4)思考:在操作游戏表game5时,先后给last_name姓名字段传递两个一样的值,效果如何?

######################唯一约束##############################
# 1.使用库
use db_game;
# 2.创建表:唯一
create table game5(
    id int primary key auto_increment unique not null, # 默认唯一且非空
    first_name varchar(20),
    last_name varchar(20) unique,
    skill varchar(255)
) engine = InnoDB default charset utf8;
# 3.插入值
insert into game5(first_name,last_name) values('宋江','宋江');
insert into game5(first_name,last_name) values('及时雨','  宋江  ');
insert into game5(first_name,last_name) values('及时雨','宋江');  # 报错
# 设定为唯一约束后, 该字段值不能重复

2.8 默认值约束 

当在创建表时给某字段添加默认值约束,语法:

create table 表名(
	字段名 数据类型(长度) [其他约束] default 值,
	...
) engine = 引擎名 default charset utf8;

当设定为默认值约束后,则:

(1)有了默认值约束后, 当不传递字段对应的值时,会使用默认值;
(2)有了默认值约束后, 当传递字段对应的值时,会传递的具体值为准。

例如,使用命令完成:

(1)在库中创建游戏表game6,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;

(2)在创建表时,给id编号添加主键约束、整型且自动增长;

(3)给skill字段设定为默认值约束,设定为轻功水上漂~

(4)思考1:添加一条数据,并给字段skill技能传递值,观察效果;

######################默认值约束#############################
# 1.使用库
use db_game;
# 2.创建表:默认
create table game6(
    id int primary key auto_increment,
    first_name varchar(20),
    last_name varchar(20),
    skill varchar(255) default '轻功水上漂~'
) engine = InnoDB default charset utf8;
desc game6;
show create table game6;
# 3.添加值, 传递值
insert into game6(first_name, last_name, skill) values ('木婉清','木婉清','剑术~~~');
# 4.不传递值
insert into game6(first_name, last_name) values ('王语嫣','王语嫣');

感谢大家的点赞收藏和关注,下一篇将继续介绍关于DQL更高级的查询,上一篇介绍的比较简单的DQL给大家一个适应过程,然后先了解一下约束和引擎后面继续介绍DQL高级查询以及多表查询。

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值