约束

约束
什么是约束
除了数据类型以外额外添加的约束
为什么要使用约束
为了保证数据的合法性 完整性

分类:
not null  非空约束  数据不能为空
create table student (id ind,name char(10) not null);

default 默认值约束 可以指定字段的默认值
create table user (id ind,name char(10) not null,sex char(1) default "woman");

unique 唯一性约束 该字段的值不能重复
unique其实是一种索引: 索引是一种数据结构 用于提高查询效率
可以为空
一张表中可以有多个唯一约束
单列唯一约束
create table t5(idcard char(18) unique);
多列联合唯一约束
create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
意思: 身份证相同 并且 手机号相同 那就叫相同

primary key
称之为主键约束
用于唯一标识表中一条记录
如何能做到唯一标识 该字段 只要是惟一的 并且不为空 即可
也就是说 从约束的角度来看主键约束 和 非空 加 唯一约束 没有区别
那它们之间的区别是什么?
唯一约束 是一种索引 必然存在硬盘上的某个文件中 是物理层面(实实在在存在的数据)
primary key 是一种逻辑意义上的数据 (实际上不存在)
换句话说 主键 就是由 唯一约束 和非空约束 组成的约束
语法:
create table stu (stuid int primary key,name char(3));
create table t7(id int unique not null,name char(3));

有主键 和没有主键的区别?
1.无法区分两个相同记录 比如班级里有两个人名字相同
2.有主键则意味有这索引 效率更高
3.可以建立关联关系
多列联合主键:
create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));
每个表都应该有主键 哪怕不用唯一标识 也应该考虑提升效率, 主键的字段名 几乎都叫id
同一个表中可以不可以有多个主键 , 主键的类型需要设置为整型

auto_increment 自动增长
作用 通常搭配主键字段使用 可以自动为你的数据分配主键
添加一条就自动加1 计数从1开始
语法:
create table t9(id int primary key auto_increment,name char(3));
如果主键是自动增长 你可以跳过这个字段 也可以为它插入null 都可以
修改自动增长的起始位置 **
alter table t9 auto_increment = 7;
注意: 自动增长 只能用于整型

分表的原因:
1.数据冗余
2.效率低下
3.扩展性差

foreign key 专门用于为表和表之间 建立物理关联
两个表之间能产生的关系
1.多对一
2.一对一
3.多对多
语法:
先创建部门表
create table dept(id int primary key auto_increment,name char(10),manager char(10));
在创建员工表
create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));
添加外键约束时产生的限制:
被关联的表(主表)需要先被创建
在主表的数据删除前 要保证从表关联该数据的数据都删除了
在更新主表主键前 要先保证从表没有关联到该主键
简单的说 外键指的是 另一张的主键
外键加上以后 主表中的数据 删除 和更新时 都受到限制
解决的方案是为 外键 添加 级联操作
级联操作
指的是就是同步更新和删除
语法:在创建外键时 在后面添加 on update cascade 同步更新
on delete cascade 同步删除
实例:
create table class(id int primary key auto_increment,name char(10));
create table student(
id int primary key auto_increment,
name char(10),
c_id int,
foreign key(c_id) references class(id)
on update cascade
on delete cascade
);

 


对主表的id进行更新
以及删除某条主表记录 来验证效果
多对多关系的处理:
建立一个第三方表 专门存储两个表之间的关系
这个关系表 应该有两个字段 分别关联学生的id 和老师的id
为了保证 数据的合法性 完整性 给这两个字段都添加外键约束
实例:
create table teacher (id int primary key auto_increment,name char(10));
create table student (id int primary key auto_increment,name char(10));
create table t_s (t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id)
);
       为了避免重复无用的关系数据  关系表加上关联的主键约束
create table t_s (t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
primary key(t_id,s_id)
);
insert into student value(null,"lxx");
insert into teacher value(null,"exx");
insert into t_s value(1,1);

 

posted @ 2018-09-13 15:42  い年少有为  阅读(126)  评论(0编辑  收藏  举报