重点!!!
1.什么是约束???常见的约束有哪些????
在创建表的时候,可以给表的字段添加相应的约束.添加约束的目的是保证数据合法性,有效性,完整性...等等等.......
2.常见的约束有哪些呢??
注意:
not null没有表级约束,其他都有表级约束!
3.非空约束 not null.
a.没有表级约束
b.给已经创建好的表的字段修改约束
c.xxx.sql 被称作sql脚本文件 编写了大量了sql 文件。该文件中的所有sql 语句全部执行
source 绝对路径 (终端执行)
4.唯一性约束
唯一性约束修饰的字段具有唯一性,不能重复.但可以为null. 例如:座位号
* 案例:给某一列添加unique
以上zhangsan不能重复..zhangsan只能出现一次.该属性设置了唯一性
* 案例:给两个列或者多个列添加unique
(多个字段联合添加约束) (表级约束)
(添加了两个约束.) (列级约束)
注意: not null没有表级约束,只有列级约束!!
解释: unique
添加唯一性约束的列上会自动创建唯一索引
删除唯一约束只能通过删除唯一索引的方式删除.
null值可以重复!
场景:现在有新需求就是两个字段联合起来就有唯一性
错误: create table class
(
id,
name unique,
type unique(列级约束)
) 这个是各自唯一
正确:create table class
(
id,
name ,
type ,
unique(name,type)(这样被称为表级约束)(多个字段联合起来约束)
) 即使张三和张三的名字重复了但是仍然可以插入
4.主键约束 primary key
测试:
a.加了一个重复的值
b.(将主键字段设置为默认null)
结论:
主键相关的术语:
主键约束 : primary key
主键字段 :
主键值 :
主键有什么作用?
- 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键,否则没有主键是非法的,
我们平常的ID就是主键,主键不能为空也不能重复,你可以姓名性别等信息一样,但是主键不可以
- 主键的作用: 主键值是这行记录在这张表当中的唯一标识(一行数据里面的身份证号)
根据主键性质来划分:
自然主键: 主键值最好就是一个和业务没有任何关系的自然数..(推荐用),不重复就行
业务主键: 主键值和系统的业务挂钩..与业务紧密关联
最好不要拿着一张表的有业务含义的字段来做主键.. 因为一旦以后的业务发生改变的话,主键值可能也会随着发生变化.. 但有时候主键值没法改变,因为改变可能会导致主键值重复了... 假设银行卡号被修改了
注意:一张表的主键约束只能有1个,主键字段上的每一个值是这一行记录在表中的唯一标识.(身份证号)
深层:
而整个表的数据就是依赖这个主键索引去构建的,对应的数据结构叫做b+树
不建议删除主键约束.
5.主键自增
注册用户时候系统自己分配主键
auto_increment 是在内存中加载让主键部分以1自增..一旦重启服务器就不会出现裂缝问题.
接着实际有的主键的继续递增..(是在内存中的)
6.外键约束
外键约束: foreign key
外键字段: 该字段上添加了外键约束
外键值: 外键当中的每一个值
场景:两张表(班级表和学生表)(一对一,一个学生只属于一个班级)
a.这个班级NO找到就知道哪个班了(如果将来不添加约束的话,有可能写的这个班级编号不存在)
为了保证Cno的值都在其表的范围内 ,所以我们就要加上约束,让它去引用外键表的字段,这个就是外键约束的作用
解释:
用外键约束之后,就有了父子关系,所以要遵循规则
顺序要求(有思想):
注意:
父表被引用的字段最低的要求是unique,但通常是主键.父表的某个字段只要是唯一性就行,不能重复
外键可以为null
总结:
当加unique约束的时候,会自动创建唯一索引
当加主键约束的时候,会自动创建主键索引
当加外键约束的时候,会自动创建普通索引
语法:
结论:
一般会在应用层面解决引用数据的完整性,而不是通过数据库中的外键,外键与级联更新适合单机低并发.不适合分布式,高并发集群..级联更新是强阻塞,存在数据库"更新风暴"的问题,
外键影响数据库的插入速度.
但是建外键约束,对查询没有影响,只会限制对数据的增删改!(重点)
7.check约束(实际开发没怎么用)
默认值约束 default