约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件。
一 数据约束
1.默认值 default
表中的字段,默认的默认值为NULL
如果插入数据时,不给某个字段赋值,那么这个字段就使用设置的默认值。如果赋值,就使用实际赋的值,这个值可以为NULL
创建时设置某个字段的默认值
create table student(
id int default 100,
name char(10) default 'zzz'
)
修改某个字段的默认值
alter table student modify column name char(10) default 'smile';
【MYSQL里可以使用FIRST和AFTER关键字指定添加的字段的位置】
alter table user add column sex int after name
2.非空 (是否为null)
插入数据时,如果非空字段赋值为NULL,运行sql命令会报错。如果非空字段没有赋值,会使用该字段的默认值
修改
alter table student modify java int not null;
创建时设置某个字段非空
CREATE table user(
id int not null,
name varchar(10) not null,
age int ,
java int
);
3.唯一 (Unique)
如果某个字段设置为unique,在整个表中,该字段的值不能重复。但是,设置为unique的字段,值可以为NULL,而且NULL WW223wsa可以重复出现
修改
alter table student modify score int unique;
eg: insert into student(id,score) values(8,100);
//运行多次,报错
1062 - Duplicate entry '100' for key 'score'
eg: insert into student(id,score) values(8,NULL); //运行多次,不会报错
4.自增(AUTO INCREMENT)
ALTER TABLE student
MODIFY COLUMN id int(11) AUTO_INCREMENT FIRST ;
某个字段 单独设置为自增,报错,必须结合主键使用
设为自增的字段,值从1开始,每次插入数据时,找到该字段的最大值,然后进行+1的自增操作
插入数据时,如果指定字段,针对自增字段,可以赋值,也可以不赋值。但是,如果表名后没有指定字段,表示每个字段都要赋值,自增字段也必须赋值
5.主键 (PRIMARY KEY)
通过主键,可以保证数据表中的记录唯一
一般将表示唯一数据的字段,设为主键,如学号、身份证号、自增字段等
添加主键
alter table student add PRIMARY KEY(id);
【在添加主键之前,必须先把重复的id删除掉。】
删除主键
alter table student drop primary key;
可以通过多个字段表示联合主键
create table seckill(
phone varchar(11) not null,
name varchar(11),
p_num int,
p_name varchar(12),
p_price double,
primary key(phone,p_num)
)
主键相当于:非空(not null) + 唯一(unique)
6.外键 (FOREIGN KEY)
学生信息 student 【id,name,age,tid】
tid 就是student表中的外键
对应的是teacher表中id
老师信息 teacher
【id,name,phone】
外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。与主关键字相同,不能使用一个定义为 TEXT 或IMAGE 数据类型的列创建外关键字。外关键字最多由16 个列组成。
建立外键
学生表 (id,name,score,tid)
教师表 (id,name,phone,salary)
alter table student add
foreign key (tid)
references teacher (id);
通过外键对多个表的数据进行约束
student表中的tid为外键,关联teacher表的id字段
主表:通过其他表的外键进行关联,约束其他表的数据,比如teacher表
副表:有外键的表,被约束的表,比如student表
增加外键后:
向student表中添加数据时,如果对应的teacher字段的值,在teacher表中没有,插入数据失败
student 外键 副表在添加
teacher 主表
进行数据操作时,要求:
添加数据:主表先添加数据,副表再添加
删除数据:先删除副表数据,再删除主表
更新数据:主副表更新都会失败
1451 - Cannot delete or update a parent row: a foreign key constraint fails
但是如果想删除或更新主表数据不报错,需要进行级联操作
(2)级联操作
Cascade
删除主表数据时,也删除副表数据
更新主表数据时,也更新副表数据
alter table student add
CONSTRAINT `fid1`
foreign key (tid)
references teacher (id)
on delete CASCADE
on UPDATE CASCADE;
【
on update 和 on delete 后面可以跟的词语有四个
no action , set null , set default ,cascade
no action 表示不做任何操作,
set null 表示在外键表中将相应字段设置为null
set default 表示设置为默认值
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
】
Restrict 表示没有级联操作 同 no action
二 数据库设计
1 范式
第一范式:保证数据库表中字段的原子性(字段中的信息不能再拆分了)
例如:
编码 姓名 联系方式
001 张三 13134567891/125632(qq)/[email protected]
联系方式的内容可以拆分,不符合第一范式
第二范式:在满足第一范式的基础上,表中的字段要和主键有关联
例如
编码 姓名 手机号 是否下雨
001 王五 1345678901 是
第三范式:在满足第二范式的基础上,表中的字段和主键是直接关联,而不是间接关联
例如:
学号 姓名 系编码 系名 课程 课程用书
001 xiaoming X100 计算机系 java
不满足第三范式,拆成三个表,学生表(包含系编号、课程编号),系表,课程表
2 多表查询
[教室表room:id,name,subject
教师表teacher:id,name,phone,rid
学生表student:id,name,tid,rid]
(1)内连接 INNER JOIN
查询老师带班级及所授科目
name cname subject
SELECT teacher.id,teacher.name,teacher.phone,room.name,room.subject
from teacher,room
where teacher.rid = room.id;
SELECT teacher.id,teacher.name,teacher.phone,room.name,room.subject
from teacher
INNER JOIN room
on teacher.rid = room.id;
-- 给表指定别名 --
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t
INNER JOIN room r
on t.rid = r.id;
(2)外连接
左外连接:左边表的数据,不管是否匹配上,都会显示,右边表的数据显示NULL
SELECT teacher.id,teacher.name,teacher.phone,room.name,room.subject
from teacher
LEFT JOIN room
on teacher.rid = room.id;
-- OUTER 可以省略--
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t
LEFT OUTER JOIN room r
on t.rid = r.id;
右外连接:右边表的数据,不管是否匹配上,都会显示,左边表上未匹配上的字段显示NULL
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t
RIGHT JOIN room r
on t.rid = r.id;
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
(3)交叉连接
笛卡尔积
不带where,查询出的数据行数为两个表的笛卡尔积(数据行数的乘积)
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t , room r
(4)自连接
员工信息表
员工id(pid) name 经理id(mid) 部门 salary partment
查看每位员工的经理是谁
SELECT e1.name 员工 ,e2.name 领导
from employee e1,employee e2
WHERE e1.mid = e2.pid;
查询多对多关系表时:
Select * from c
inner join sc on c.id=sc.cid
inner join s on s.num=sc.sid
三 备份数据
备份的目的
做灾难恢复:对损坏的数据进行恢复和还原
需求改变:因需求改变而需要把数据还原到改变以前
测试:测试新功能是否可用
备份数据库:(命令在DOS的\\mysql\\bin目录下执行)
1.导出整个数据库
导出文件默认是存在mysql\bin目录下
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3.导出一个数据库结构
mysqldump -u user_name -p -d –-add-drop-table database_name > outfile_name.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
导入数据库(恢复数据)
常用source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库(绝对路径)
一 数据约束
1.默认值 default
表中的字段,默认的默认值为NULL
如果插入数据时,不给某个字段赋值,那么这个字段就使用设置的默认值。如果赋值,就使用实际赋的值,这个值可以为NULL
创建时设置某个字段的默认值
create table student(
id int default 100,
name char(10) default 'zzz'
)
修改某个字段的默认值
alter table student modify column name char(10) default 'smile';
【MYSQL里可以使用FIRST和AFTER关键字指定添加的字段的位置】
alter table user add column sex int after name
2.非空 (是否为null)
插入数据时,如果非空字段赋值为NULL,运行sql命令会报错。如果非空字段没有赋值,会使用该字段的默认值
修改
alter table student modify java int not null;
创建时设置某个字段非空
CREATE table user(
id int not null,
name varchar(10) not null,
age int ,
java int
);
3.唯一 (Unique)
如果某个字段设置为unique,在整个表中,该字段的值不能重复。但是,设置为unique的字段,值可以为NULL,而且NULL WW223wsa可以重复出现
修改
alter table student modify score int unique;
eg: insert into student(id,score) values(8,100);
//运行多次,报错
1062 - Duplicate entry '100' for key 'score'
eg: insert into student(id,score) values(8,NULL); //运行多次,不会报错
4.自增(AUTO INCREMENT)
ALTER TABLE student
MODIFY COLUMN id int(11) AUTO_INCREMENT FIRST ;
某个字段 单独设置为自增,报错,必须结合主键使用
设为自增的字段,值从1开始,每次插入数据时,找到该字段的最大值,然后进行+1的自增操作
插入数据时,如果指定字段,针对自增字段,可以赋值,也可以不赋值。但是,如果表名后没有指定字段,表示每个字段都要赋值,自增字段也必须赋值
5.主键 (PRIMARY KEY)
通过主键,可以保证数据表中的记录唯一
一般将表示唯一数据的字段,设为主键,如学号、身份证号、自增字段等
添加主键
alter table student add PRIMARY KEY(id);
【在添加主键之前,必须先把重复的id删除掉。】
删除主键
alter table student drop primary key;
可以通过多个字段表示联合主键
create table seckill(
phone varchar(11) not null,
name varchar(11),
p_num int,
p_name varchar(12),
p_price double,
primary key(phone,p_num)
)
主键相当于:非空(not null) + 唯一(unique)
6.外键 (FOREIGN KEY)
学生信息 student 【id,name,age,tid】
tid 就是student表中的外键
对应的是teacher表中id
老师信息 teacher
【id,name,phone】
外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。与主关键字相同,不能使用一个定义为 TEXT 或IMAGE 数据类型的列创建外关键字。外关键字最多由16 个列组成。
建立外键
学生表 (id,name,score,tid)
教师表 (id,name,phone,salary)
alter table student add
foreign key (tid)
references teacher (id);
通过外键对多个表的数据进行约束
student表中的tid为外键,关联teacher表的id字段
主表:通过其他表的外键进行关联,约束其他表的数据,比如teacher表
副表:有外键的表,被约束的表,比如student表
增加外键后:
向student表中添加数据时,如果对应的teacher字段的值,在teacher表中没有,插入数据失败
student 外键 副表在添加
teacher 主表
进行数据操作时,要求:
添加数据:主表先添加数据,副表再添加
删除数据:先删除副表数据,再删除主表
更新数据:主副表更新都会失败
1451 - Cannot delete or update a parent row: a foreign key constraint fails
但是如果想删除或更新主表数据不报错,需要进行级联操作
(2)级联操作
Cascade
删除主表数据时,也删除副表数据
更新主表数据时,也更新副表数据
alter table student add
CONSTRAINT `fid1`
foreign key (tid)
references teacher (id)
on delete CASCADE
on UPDATE CASCADE;
【
on update 和 on delete 后面可以跟的词语有四个
no action , set null , set default ,cascade
no action 表示不做任何操作,
set null 表示在外键表中将相应字段设置为null
set default 表示设置为默认值
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
】
Restrict 表示没有级联操作 同 no action
二 数据库设计
1 范式
第一范式:保证数据库表中字段的原子性(字段中的信息不能再拆分了)
例如:
编码 姓名 联系方式
001 张三 13134567891/125632(qq)/[email protected]
联系方式的内容可以拆分,不符合第一范式
第二范式:在满足第一范式的基础上,表中的字段要和主键有关联
例如
编码 姓名 手机号 是否下雨
001 王五 1345678901 是
第三范式:在满足第二范式的基础上,表中的字段和主键是直接关联,而不是间接关联
例如:
学号 姓名 系编码 系名 课程 课程用书
001 xiaoming X100 计算机系 java
不满足第三范式,拆成三个表,学生表(包含系编号、课程编号),系表,课程表
2 多表查询
[教室表room:id,name,subject
教师表teacher:id,name,phone,rid
学生表student:id,name,tid,rid]
(1)内连接 INNER JOIN
查询老师带班级及所授科目
name cname subject
SELECT teacher.id,teacher.name,teacher.phone,room.name,room.subject
from teacher,room
where teacher.rid = room.id;
SELECT teacher.id,teacher.name,teacher.phone,room.name,room.subject
from teacher
INNER JOIN room
on teacher.rid = room.id;
-- 给表指定别名 --
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t
INNER JOIN room r
on t.rid = r.id;
(2)外连接
左外连接:左边表的数据,不管是否匹配上,都会显示,右边表的数据显示NULL
SELECT teacher.id,teacher.name,teacher.phone,room.name,room.subject
from teacher
LEFT JOIN room
on teacher.rid = room.id;
-- OUTER 可以省略--
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t
LEFT OUTER JOIN room r
on t.rid = r.id;
右外连接:右边表的数据,不管是否匹配上,都会显示,左边表上未匹配上的字段显示NULL
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t
RIGHT JOIN room r
on t.rid = r.id;
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
(3)交叉连接
笛卡尔积
不带where,查询出的数据行数为两个表的笛卡尔积(数据行数的乘积)
SELECT t.id,t.name,t.phone,r.name,r.subject
from teacher t , room r
(4)自连接
员工信息表
员工id(pid) name 经理id(mid) 部门 salary partment
查看每位员工的经理是谁
SELECT e1.name 员工 ,e2.name 领导
from employee e1,employee e2
WHERE e1.mid = e2.pid;
查询多对多关系表时:
Select * from c
inner join sc on c.id=sc.cid
inner join s on s.num=sc.sid
三 备份数据
备份的目的
做灾难恢复:对损坏的数据进行恢复和还原
需求改变:因需求改变而需要把数据还原到改变以前
测试:测试新功能是否可用
备份数据库:(命令在DOS的\\mysql\\bin目录下执行)
1.导出整个数据库
导出文件默认是存在mysql\bin目录下
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3.导出一个数据库结构
mysqldump -u user_name -p -d –-add-drop-table database_name > outfile_name.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
导入数据库(恢复数据)
常用source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库(绝对路径)