目录

数据库备份

备份的应用场景

备份与还原的语句

备份格式:

还原格式:

备份操作:

还原操作

图形化界面备份与还原

备份数据库中的数据

还原数据库中的数据

数据库约束

数据库约束的概述

约束的作用:

约束种类:

主键约束

主键的作用

哪个字段应该作为表的主键? 

联合主键

主键的特点:

创建主键方式:

删除主键

主键自增

唯一约束

什么是唯一约束:

唯一约束的基本格式

实现唯一约束

非空约束

什么是非空约束:

非空约束的基本语法格式

默认值

什么是默认值:

默认值的语法:

外键约束

单表的缺点

什么是外键约束

创建约束的语法

删除外键

外键的级联

数据约束小结

表与表之间的关系

表关系的概念

一对多

多对多

一对一

SQL实现代码:

一对一的架构图

一对多关系案例

需求:一个旅游线路分类中有多个旅游线路

具体操作:

多对多关系案例

需求:一个用户收藏多个线路,一个线路被多个用户收藏

具体操作:

表与表之间的关系小结


数据库备份

备份的应用场景

 在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。

 

备份与还原语句

备份格式:

  • 注:这个操作不用登录。这个可执行文件在mysql/bin/mysqldump.exe     

将数据库中所有的表,记录创建一遍,并且生成SQL语句

4. MySQL -- MySQL表的约束

 

 

还原格式:

  • 注:这个操作必须登录,选中某个数据才能还原

4. MySQL -- MySQL表的约束

备份操作:

 

  • 备份day15数据库中的数据到d:\day15.sql文件中

4. MySQL -- MySQL表的约束

  • 导出结果:数据库中的所有表和数据都会导出成SQL语句

还原操作

  • 还原day15数据库中的数据,注意:还原的时候需要先登录MySQL,并选中对应的数据库。
  1. 删除day15数据库中的所有表
  2. 登录MySQL
  3. 选中数据库
  4. 使用SOURCE命令还原数据
  5. 查看还原结果

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

图形化界面备份与还原

备份数据库中的数据

  1. 选中数据库,右键 ”备份/导出”
  2. 指定导出路径,保存成.sql文件即可。

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

还原数据库中的数据

 

  1. 删除数据库
  2. 数据库列表区域右键“执行SQL脚本”, 指定要执行的SQL文件,执行即可

4. MySQL -- MySQL表的约束  

4. MySQL -- MySQL表的约束


数据库约束

数据库约束的概述

约束的作用:

一般在创建表的时候,约表结构添加一些约束。让所有的数据在添加进表的时候,进行约束的检查,从而保证表中的记录数据是正确的,约束可以保证数据的正确性,完整性和有效性。

约束种类:

 

建议约束在创建表结构的时候创建约束,从而可以保证所有的记录在插入前进行约束检查。如果表中已经有了记录,再添加约束。如果约束与表中的记录有冲突会导致约束添加失败。

4. MySQL -- MySQL表的约束

主键约束

主键的作用

每个表都应该创建一个主键,主键可以是一列,也可以是多列,如果是多列,称为联合主键。

主键用来唯一标识表中的一条记录

 

哪个字段应该作为表的主键? 

不建议使用与业务相关的列做为主键,如:身份证。

主键最好与业务不相关,而且有没有含义并不重要,主键通常是给程序员的使用,而不是给最终的客户使用。

 

联合主键

如果表中有两列或两列以上共同组成的主键,称为联合主键。

 

主键的特点:

  1. 唯一性
  2. 非空

创建主键方式:

1. 在创建表的时候给字段添加主键

4. MySQL -- MySQL表的约束

2. 在已有表中添加主键

4. MySQL -- MySQL表的约束

-- 创建表学生表st1, 包含字段(id, name, age)将id做为主键

create table st1(

  id int primary key,

  name varchar(20),

  age int

);


drop table st1;


create table st1(

  id int,

  name varchar(20),

  age int,

  -- 创建主键

  primary key(id)

);


-- 创建联合主键

create table st1(

  id int,

  name varchar(20),

  age int,

  -- 创建主键

  primary key(id,name)

);


-- 插入重复的主键值

select * from st1;

insert into st1 values(1,'张三',20);

-- Duplicate 重复 entry 记录 '1' for key 'PRIMARY'

insert into st1 values(1,'李四',20);


-- 插入NULL的主键值

-- Column 列 'id' cannot be null

insert into st1 values(null,'李四',20);

 

 

删除主键

-- 删除st1表的主键

alter table st1 drop primary key;

-- 在表存在的时候创建主键

alter table st1 add primary key (id);

主键自增

 

 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值。

自增长列一定是用在主键上,如果主键添加了自增长功能,那么主键约束不能被删除。如果需要删除主键,必须先删除自增。

  • 主键自增的语法:

4. MySQL -- MySQL表的约束

select * from st2;
-- 插入数据

insert into st2 (name,age) values('小乔', 20);

insert into st2 (name,age) values('大乔', 22);

-- Column count doesn't match value count at row 1

insert into st2 values('大乔', 22);

-- 省略前面所有列名

insert into st2 values(null, '大乔', 22);


-- 删除自增长

alter table st2 change id id int;

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

  • 修改主键自增的起始值
-- 创建学生表st2, 包含字段(id, name, age)将id做为主键并自动增长

create table st2 (

  id int primary key auto_increment,

  name varchar(20),

  age int

);


desc st2;


select * from st2;

-- 插入数据

insert into st2 (name,age) values('小乔', 20);

insert into st2 (name,age) values('大乔', 22);

-- Column count doesn't match value count at row 1

insert into st2 values('大乔', 22);

-- 省略前面所有列名

insert into st2 values(null, '大乔', 22);


-- 删除自增长

alter table st2 change id id int;


-- 删除表

drop table st2;


-- 将主键的起始值设置为1000

alter table st2 auto_increment=1000;

insert into st2 (name,age) values('小乔', 20);

insert into st2 (name,age) values('大乔', 22);



select * from st2;

 

唯一约束

什么是唯一约束:

表中某一列不能出现重复的值

唯一约束的基本格式

4. MySQL -- MySQL表的约束

 

 

实现唯一约束

4. MySQL -- MySQL表的约束

-- 创建学生表st3, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生

create table st3 (

   id int primary key auto_increment,

   name varchar(20) unique

);


desc st3;

-- 添加一个同名的学生

insert into st3 values(null, '张三');


-- Duplicate entry '张三' for key 'name'


select * from st3;


insert into st3 values(null, '李四');

 

非空约束

什么是非空约束:

表中某一列不能为空

非空约束的基本语法格式

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

-- 创建表学生表st4, 包含字段(id,name,gender)其中name不能为NULL

create table st4 (

   id int primary key auto_increment,

   name varchar(20) not null,

   gender char(1)

);


desc st4;


-- 添加一条记录其中姓名不赋值

-- Column 'name' cannot be null

insert into st4 values(null, null, '男');

insert into st4 values(null, '张三', '男');


select * from st4;

默认值

什么是默认值:

如果某一列没有添加值,则使用默认的值

默认值的语法:

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

-- 创建一个学生表 st5,包含字段(id,name,address), 地址默认值是广州

create table st5 (

  id int,

  name varchar(20),

  address varchar(20) default '广州'

);


-- 添加一条记录,使用默认地址

select * from st5;


insert into st5 values(1, '张三', null);

insert into st5 values(2, '张三', default);

insert into st5 (id,name)values(3, '李四');


desc st5;


-- 添加一条记录,不使用默认地址

insert into st5 values(4, '李四','深圳');

 

外键约束

单表的缺点

创建一个员工表包含如下列(id, name, age, dep_name, dep_location),id主键并自动增长,添加5条数据

CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(30),
    age INT,
    dep_name VARCHAR(30),
    dep_location VARCHAR(30)
);

-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');

INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');
  • 以上数据表的缺点:

1) 出现大量重复部门的数据,数据冗余

2) 如果某个部门只有一个员工,删除这个员工的时候,创建导致部门也消失。

3) 如果添加部门信息出现错误,导致数据出现歧义。

4. MySQL -- MySQL表的约束

  • 解决方案:

创建成两张表,一张员工表,一张部门表。并且给员工表与部门表之间添加外键关键

4. MySQL -- MySQL表的约束

-- 创建部门表(id,dep_name,dep_location)

create table department (

   id int primary key auto_increment,

   dep_name varchar(20),

   dep_location varchar(30)

);


-- 创建员工表(id,name,age,dep_id)

create table employee(

   id int primary key auto_increment,

   name varchar(20),

   age int,

   -- 外键

   dep_id int

)


-- 添加2个部门

insert into department (dep_name,dep_location )values ('研发部', '广州'),('销售部', '深圳');

select * from department;


-- 添加员工,dep_id表示员工所在的部门

INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);

INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);

INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);


INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);

INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);

INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);


select * from employee;


-- 添加一个员工在,6号部门,数据是有问题的。必须添加外键约束

INSERT INTO employee (NAME, age, dep_id) VALUES ('老张', 30, 6);
  • 问题:当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部门,实际应用中不能出现这种情况。employee的dep_id中的数据只能是department表中存在的id

4. MySQL -- MySQL表的约束

  • 目标: 需要约束dep_id只能是department表中已经存在id
  • 解决方式: 使用外键约束

什么是外键约束

  1. 主表: 如果两张表中有一对多的关系,一方的表称为主表,多方的表称为从表。约束别人的表
  2. 从表: 多方称为从表,使用别人的数据,被别人约束的表。
  3. 什么是外键:外键在从表中

4. MySQL -- MySQL表的约束​​​​​​​

创建约束的语法

  • 新建表时增加外键:

4. MySQL -- MySQL表的约束

  • 已有表增加外键:

4. MySQL -- MySQL表的约束

  • 具体操作:
  1. 删除副表/从表 employee
  2. 创建从表 employee 并添加外键约束emp_depid_fk
  3. 正常添加数据
  4. 部门错误的数据添加失败
-- 创建员工表(id,name,age,dep_id)

create table employee(

   id int primary key auto_increment,

   name varchar(20),

   age int,

   -- 外键

   dep_id int,

   constraint emp_depid_fk foreign key (dep_id) references department(id)

);


-- 添加正确的数据

INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);

INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);

INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);


INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);

INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);

INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);


select * from employee;

-- 添加问题数据

-- Cannot add or update a child row 从表中行 : a foreign key constraint fails

INSERT INTO employee (NAME, age, dep_id) VALUES ('老张', 30, 6);

 

 

删除外键

4. MySQL -- MySQL表的约束

-- 删除employee表的emp_depid_fk外键

alter table employee drop foreign key emp_depid_fk;


-- 在employee表存在的情况下添加外键

alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id);

外键的级联

 

-- 要把部门表中的id值2,改成5,能不能直接更新呢?

select * from department;

select * from employee;


-- Cannot delete or update a parent row  主表中行 : a foreign key constraint fails

update department set id=5 where id=2;


-- 要删除部门id等于1的部门

delete from department where id=1;
  • 什么是级联操作:

在修改和删除主表的主键时,同时更新或删除副表的相应的行,称为级联操作

4. MySQL -- MySQL表的约束

-- 删除外键约束

alter table employee drop foreign key emp_depid_fk;


-- 添加外键约束,级联更新和级联删除

alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id)

on update cascade on delete cascade



select * from department;


select * from employee;


-- 把部门表中id等于1的部门改成id等于9

update department set id=9 where id=1;


-- 删除部门号是2的部门

delete from department where id=2;

数据约束小结

4. MySQL -- MySQL表的约束


表与表之间的关系

表关系的概念

 现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!

4. MySQL -- MySQL表的约束

一对多

一对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品

一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

4. MySQL -- MySQL表的约束

多对多

多对多(m:n) 例如:老师和学生,学生和课程,用户和角色

多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。 将两个一对多加到一起变成了一个多对多的关系。

4. MySQL -- MySQL表的约束

一对一

一对一(1:1) 在实际的开发中应用不多.因为一对一可以创建成一张表。

两种建表原则:

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束​​​​​​​

SQL实现代码:

-- 创建一对一的关系

create table student (

   id int primary key,

   name varchar(20)

);


-- 从表

create table stu_info (

   id int primary key,

   birth_address varchar(20),

   use_name varchar(20),

   weight double,

   -- 创建外键约束

   foreign key (id) references student(id)

)

一对一的架构图

 

4. MySQL -- MySQL表的约束

一对多关系案例

需求:一个旅游线路分类中有多个旅游线路

  • 界面

4. MySQL -- MySQL表的约束

  • 表与表的关系

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束​​​​​​​

具体操作:

-- 创建一对多的关系

-- 创建旅游线路分类表tab_category

/*

cid旅游线路分类主键,自动增长

cname旅游线路分类名称非空,唯一,字符串100

*/

create table tab_category (

   cid int primary key auto_increment,

   cname varchar(100) not null unique

);


-- 添加旅游线路分类数据:('周边游'), ('出境游'), ('国内游'), ('港澳游')

insert into tab_category (cname) values ('周边游'), ('出境游'), ('国内游'), ('港澳游');


select * from tab_category;


-- 创建旅游线路表tab_route

/*

rid旅游线路主键,自动增长

rname旅游线路名称非空,唯一,字符串100

price价格

rdate 上架时间,日期类型

cid 外键,所属分类

*/

create table tab_route (

    rid int primary key auto_increment,

    rname varchar(100) not null unique,

    price double,

    rdate date,

    cid int,

    foreign key (cid) references tab_category(cid)

)


-- 添加旅游线路数据

INSERT INTO tab_route VALUES

(NULL, '【厦门+鼓浪屿+南普陀寺+曾厝垵 高铁3天 惠贵团】尝味友鸭面线 住1晚鼓浪屿', 1499, '2018-01-27', 1),

(NULL, '【浪漫桂林 阳朔西街高铁3天纯玩 高级团】城徽象鼻山 兴坪漓江 西山公园', 699, '2018-02-22', 3),

(NULL, '【爆款¥1699秒杀】泰国 曼谷 芭堤雅 金沙岛 杜拉拉水上市场 双飞六天【含送签费 泰风情 广州往返 特价团】', 1699, '2018-01-27', 2),

(NULL, '【经典•狮航 ¥2399秒杀】巴厘岛双飞五天 抵玩【广州往返 特价团】', 2399, '2017-12-23', 2),

(NULL, '香港迪士尼乐园自由行2天【永东跨境巴士广东至迪士尼去程交通+迪士尼一日门票+香港如心海景酒店暨会议中心标准房1晚住宿】', 799, '2018-04-10', 4);

多对多关系案例

需求:一个用户收藏多个线路,一个线路被多个用户收藏

4. MySQL -- MySQL表的约束

4. MySQL -- MySQL表的约束

对于多对多的关系我们需要增加一张中间表来维护他们之间个关系

4. MySQL -- MySQL表的约束​​​​​​​

具体操作:

/*

创建用户表tab_user

uid用户主键,自增长

username用户名长度100,唯一,非空

password密码长度30,非空

name真实姓名长度100

birthday生日

sex性别,定长字符串1

telephone手机号,字符串11

email邮箱,字符串长度100

*/

create table tab_user (

   uid int primary key auto_increment,

   username varchar(100) unique not null,

   password varchar(30) not null,

   name varchar(100),

   birthday date,

   sex char(1),

   telephone varchar(11),

   email varchar(100)

)


-- 添加用户数据

INSERT INTO tab_user VALUES

(NULL, 'cz110', 123456, '老王', '1977-07-07', '男', '13888888888', '[email protected]'),

(NULL, 'cz119', 654321, '小王', '1999-09-09', '男', '13999999999', '[email protected]');


/*

创建收藏表tab_favorite

rid 旅游线路id,外键

date 收藏时间

uid用户id,外键

rid和uid不能重复,设置复合主键,同一个用户不能收藏同一个线路两次

*/

create table tab_favorite(

   rid int,

   `date` date,

   uid int,

   -- 联合主键

   primary key(rid, uid),

   -- 创建外键

   foreign key (rid) references tab_route(rid),

   foreign key(uid) references tab_user(uid)

)


-- 增加收藏表数据

INSERT INTO tab_favorite VALUES

(1, '2018-01-01', 1), -- 老王选择厦门

(2, '2018-02-11', 1), -- 老王选择桂林

(3, '2018-03-21', 1), -- 老王选择泰国

(2, '2018-04-21', 2), -- 小王选择桂林

(3, '2018-05-08', 2), -- 小王选择泰国

(5, '2018-06-02', 2); -- 小王选择迪士尼

4. MySQL -- MySQL表的约束

表与表之间的关系小结

4. MySQL -- MySQL表的约束

相关文章: