目录
28,insert语句一次插入多条记录(掌握)
29,快速创建表(了解内容)
30,将查询结果插入到一张表当中。insert相关的!(了解内容)
31,快速删除表中的数据(truncate比较重要,必须掌握)
delete语句删除数据的原理(delete属于DML语句)
Truncate语句删除数据的原理
删除表操作:
32,对表结构的增删改(DDL语句)
什么是对表结构的修改
33,约束(非常重要)
33.1什么是约束
33.2约束包括那些
33.3非空约束:not null
在mysql中当中怎么执行sql脚本呢
33.4唯一性约束:unique
新需求:name和email两个字段联合起来具有唯一性!!
什么时候使用表级约束?
33.5unique和not null联合使用
33.6主键约束(primary key,简称pk)(非常重要)
主键约束的相关术语
什么是主键?有啥用?
怎么给一张表添加主键约束呢?
使用表级约束添加主键
一个表中主键约束能加两个吗?不能
在mysql 当中,有一种机制,可以帮助我们自动维护一个主键值
33.7外键约束(foreign key,简称FK)(非常重要)
外键约束涉及到的相关术语:
业务背景:
添加外键的mysql语句:
28,insert语句一次插入多条记录(掌握)
mysql>insert into t_user(id,name,birth,create_time) values(1,'zs','1990-10-01',now()), (2,'l s','2000-01-12',now());
查看一下可以发现插入成功
语法:insert into t_user(字段名1,字段名2...) value(),(),()...;
29,快速创建表(了解内容)
mysql> create table emp2 as select * from emp;
查询就可以发现这个表已经创建成功了
而且结构和内容和emp表一样
等于把as后面的表复制了一下
原理:
将一个查询结果当做一张表新建!
这个可以完成表的快速复制
表创建出来,同时表中的数据也存在了!
as后面的内容也可以是查询某一个字段或几个字段
比如:
mysql> create table mytable as select empno,ename from emp where job='manager';
30,将查询结果插入到一张表当中。insert相关的!(了解内容)
先快速复制一张表
mysql> create tbale dept_bak as select * from dept;
将查询结果插入到这个表中
mysql> insert into dept_bak select * from dept;
这样就把查询的结果插入到dept_bak表中了
这个语句不常用,很少用
31,快速删除表中的数据(truncate比较重要,必须掌握)
//删除dept_bak表中的数据
mysql> delete from dept_bak;//这种删除数据的方式比较慢
delete语句删除数据的原理(delete属于DML语句)
表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放
这种删除缺点是:删除效率比较低!
这种删除优点是:支持回滚,后悔了可以再恢复数据!
Truncate语句删除数据的原理
这种删除效率比较高,表被一次截断,物理删除
这种删除缺点:不支持回滚
这种删除有点:删除速度快,效率高
用法:truncate table dept_bak;(这种操作属于DDL操作)
总结:表非常大,上亿条记录,删除的时候使用delete,也许需要执行1个小时才能删 除完,效率较低,可以选择使用truncate删除表中的数据,只需要不到1秒钟时间,效 率较高,但是使用truncate之前,必须仔细询问客户是否真的要删除,并警告删除之后 不可恢复!
删除表操作:
drop table 表名;//这不是删除表中的数据,这是把表删除
32,对表结构的增删改(DDL语句)
什么是对表结构的修改
添加一个字段,删除一个字段,修改一个字段
对表结构的修改需要使用:alter
属于DDL语句
DDL包括:create drop alter
第一:在实际的开发中,需求一旦确定之后,表一旦设计好之后,很少的进行表结构的 修改,因为开发进行中的时候,修改表的结构,成本比较高
第二:由于修改表结构的操作很少,所以我们不需要掌握,如果有一天真的要修改表结构,可以使用工具
修改表结构的操作是不需要写到程序中的,实际上也不是程序员的范畴
33,约束(非常重要)
33.1什么是约束
约束对应的英语单词是:constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完 整性,有效性!
约束的作用就是为了保证:表中的数据有效!
33.2约束包括那些
非空约束:not null
唯一性约束:unique
主键约束:primary key(简称pk)
外键约束:foreign key(简称fk)
检查约束:check(mysql不支持,oracle支持)
这里重点学习学习四个约束:
not null
unique
primary key
foreign key
33.3非空约束:not null
非空约束not null约束的字段不能为null
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) not null
);
insert into t_vip(id,name) values(1,’zhangsan’);//不会报错
insert into t_vip(id,name) values(2,’lisi’);//不会报错
insert into t_vip(id) values(3);//报错,name非空,必须要设置值
小插曲:
xxxx.sql这种文件被称为sql脚本文件
sql脚本文件中编写了大量的sql语句
我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行
批量的执行sql语句,可以使用sql脚本文件
在mysql中当中怎么执行sql脚本呢
source sql所在路径
33.4唯一性约束:unique
唯一性约束unique约束的字段不能重复,但是可以为null
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) unique,
email varchar(255)
);
insert into t_vip(id,name,email) values(1,’zhangsan’,’zhangsan@123.com’);
insert into t_vip(id,name,email) values(1,’lisi,’lisi@123.com’);
insert into t_vip(id,name,email) values(1,’wangwu’,’wangwu@123.com’);
上面的语句是没有问题的
下面我们插入一个name重复的数据
insert into t_vip(id,name,email) values(1,’wangwu’,’wangwu@sina.com’);
这个语句就会报错,因为name字段时唯一性约束,不能重复
但是可以为null
insert into t_vip(id) values(4);
这样不会报错,不过name和email的值都为null了
name字段虽然被unique约束了,但是可以为null
新需求:name和email两个字段联合起来具有唯一性!!
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) unique,//约束直接添加到列后面的叫做列级约束
email varchar(255) unique
);
这张表这样创建是不符合上面”新需求”的
这样创建表示:name具有具有唯一性,email具有唯一性,各自唯一
正确创建的方式:
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255),
email varchar(255),
unique(name,email)//约束没有添加在列的后面,这种约束被称为表级约束
);
这样才是name和email联合起来唯一
什么时候使用表级约束?
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束
注意:上面的唯一性约束not null只有列级约束,没有表级约束
33.5unique和not null联合使用
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) not null unique
);
可以发现name变成主键了
在mysql中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段(注意:oracle中不一样)
mysql> insert into t_vip(id,name) values(2,'zhangsan');
mysql> insert into t_vip(id,name) values(2,'zhangsan');//错误了, name不能重复
mysql> insert into t_vip(id,name) values(2,);//错误了,name不能为空
33.6主键约束(primary key,简称pk)(非常重要)
主键约束的相关术语
主键约束:一种约束
主键字段:该字段上添加了主键约束,这样的字段叫:主键字段
主键值:主键字段中的每一个值都叫做:主键值
什么是主键?有啥用?
主键值是每一行记录的唯一标识
主键值是每一行记录的身份证号
记住:任何一张表都应该有主键,没有主键,表无效!
主键的特征:not null+unique(主键值不能是null,同时也不能重复)
怎么给一张表添加主键约束呢?
drop table if exists t_vip;
//一个字段做主播,叫做:单一主键
create table t_vip(
id int primary key, //列级约束
name varchar(255)
);
mysql> insert into t_vip(id,name) values(1,'zhangsan');
mysql> insert into t_vip(id,name) values(1,'lisi');//错误,id不能重复,为空
使用表级约束添加主键
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255),
primary key(id) //表级约束
);
表级约束主要是给多个字段联合起来添加约束
drop table if exists t_vip;
//id和name联合起来做主键:复合主键
create table t_vip(
id int,
name varchar(255),
primary key(id,name)
);
在实际开发中不建议使用复合主键,建议使用单一主键!
因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主 键可以做到,复合主键比较复杂,不建议使用!
一个表中主键约束能加两个吗?不能
drop table if exists t_vip;
create table t_vip(
id int primary key,
name varchar(255) primary key
);
这样写会报错
结论:一张表,主键约束只能添加一个(主键只能有一个)
主键值建议使用:
int
igint
char
不建议使用:
varchar
主键值一般都是数字,一般都是定长的!
主键除了:单一主键和复合主键之外,还可以分为自然主键和业务主键
自然主键:主键是一个自然数,和业务没关系
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键
在实际开发中自然主键使用比较多,业务主键不建议使用,尽量使用自然主键
在mysql 当中,有一种机制,可以帮助我们自动维护一个主键值
drop table if exists t_vip;
create table t_vip(
id int primary key auto_increment, //auto_increment表示自增,从1开 始递增
name varchar(255)
);
mysql> insert into t_vip(name) values('zhangsan');
mysql> insert into t_vip(name) values('zhangsan');
mysql> insert into t_vip(name) values('zhangsan');
mysql> insert into t_vip(name) values('zhangsan');
mysql> insert into t_vip(name) values('zhangsan');
mysql> select * from t_vip;
可以发现只给name赋值,主键值id会自增
33.7外键约束(foreign key,简称FK)(非常重要)
外键约束涉及到的相关术语:
外键约束:一种约束
外键字段:该字段上添加了外键约束
外键值:外键字段中的每一个值
业务背景:
请设计数据库表,来描述”班级和学生”的信息
第一种方案:班级和学生存储在一张表中
分析以上方案的缺点:数据冗杂,空间浪费!
这个设计是比较失败的
第二种方案:班级一张表,学生一张表
当cno字段没有任何约束的时候,可能会导致数据无效,可能出现一个102, 但是102班级不存在
所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束
那么:cno字段就是外键字段,cno字段中的每一个值都是外键值
注意:t_class是父表,t_student是子表
删除表的顺序:先删子,再删父
创建表的顺序:先创建父,再创建子
删除数据的顺序:先删子,再删父
插入数据的顺序:先插入父,再插入子
添加外键的mysql语句:
//先判断这两种表是否存在,存在的话删掉
mysql> drop table if exists t_student;
mysql> drop table if exists t_class;
//创建父表,班级表
mysql> create table t_class(
classno int primary key,
classname varchar(255)
);
//创建子表,学生表
mysql> create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) t_class(classno) //外键约束
);
上面给子表的cno字段添加一个外键约束,引用的是t_class表中的classno字 段
所以在给子表插入数据时,cno字段不能插入父表中classno字段没有的值
只能输入父表中classno字段中存在的值
思考:子表中的外键引用的父表中的某个片段,被引用的这个字段必须是主键吗?
不一定是主键,但至少具有unique约束
思考:外键可以为null吗
外键值可以为null