学习MySQL-第七章

目录

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’,’[email protected]’);

insert into t_vip(id,name,email) values(1,’lisi,’[email protected]’);

insert into t_vip(id,name,email) values(1,’wangwu’,’[email protected]’);

上面的语句是没有问题的

下面我们插入一个name重复的数据

insert into t_vip(id,name,email) values(1,’wangwu’,’[email protected]’);

这个语句就会报错,因为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

猜你喜欢

转载自blog.csdn.net/qq_52905520/article/details/127018188