约束是表级的强制规定.
什么是约束:对表中字段的限制
为什么需要约束:
为了数据完整性(精确性,可靠性).防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的.
非空约束:NOT NULL
唯一约束:UNIQUE
主键约束:PRIMARY KEY
外键约束:FOREIGN KEY
检查约束:CHECK
默认约束:DEFAULT
约束的区分:
从字段的个数上区分:
单列约束
多列约束
从约束作用范围讲:
列级约束:声明在对应字段的后面
表级约束:在表中所有字段都声明完之后,在所有字段的后面声明的约束
如何添加约束:
一般是在创建表的时候,如果表已经创建通过ALTER TABLE增加或删除约束
#如何查看约束
SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE xxxx
非空约束: NOT NULL 限制某个字段的值不能是null 默认都是DEFAULT NULL
NOT NULL 没有表级约束的写法,只有列级约束
如何添加非空约束:
CREATE TABLE test1 (
id INT,
last_name VARCHAR ( 20 ) NOT NULL,
email VARCHAR ( 20 ) NOT NULL,
salary DECIMAL ( 10, 2 ))
当然加了非空约束之后,UPDATE的时候 也会限制将非空约束字段修改为NULL 报错
修改约束
唯一约束: UNIQUE 用来限制某个字段的值在整张表中不能重复
注意:::::允许值为NULL 而且可以多个值为NULL
如何添加唯一约束:
列级约束 表级约束
用ALTER添加或修改唯一约束
如果需要指定约束名: 用CONSISTENT
ALTER table test3 ADD CONSISTENT uk_test3 UNIQUE(last_name)
注意是后期添加唯一约束时候,保证表里数据唯一性,不能会报错
复合唯一约束
删除唯一约束
删除唯一约束 其实就是删除唯一索引
主键约束: PRIMARY KEY 用来唯一标识表中的一行记录
主键约束相当于唯一约束+非空约束的组合 :主键不允许重复且非空
这里错了 因为一张表主键只有一个 因此 无需命名 即使命名了 其主键名都是PRIMARY
原因也很简单 因为一张表只能有一个主键 所以不需要命名
复合主键约束:把多个字段当一组 做为主键 但是没个字段都不能是null
添加主键
删除主键约束:属于没事找事
自增列: AUTO_INCREMENT
自增列一般都会添加到主键上, 唯一约束列也可以,一个表中只能有一个自增长列
自增列数据类型必须为整型(不能单独添加到一列上,必须和主键约束或唯一约束一起使用且字段类型必须为整形)
外键约束:FOREIGN KEY 外键约束 一个表中可以声明多个外键约束
作用:限定某张表的某个字段的引用完整性
一个表的外键,关联了另外一张表的主键,如果这个外键的值在另外一张表中主键没有这个值就无法插入,一般我们称外键的这张表为子表,关联主键的表为主表(父表)
在删除主表记录(数据)前要先删除子表关联数据
在向子表插入数据时,外键值必须是主表有的值(如果主表没有该值,报错)
必须引用主表的主键或者唯一约束列
链接:https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q
提取码:b0rp
--来自百度网盘超级会员V5的分享
像上面表中员工表 有三个外键 分别是job_id department_id manager_id关联的是自己的id主键
关键名字和对应表名可以不一样,类型必须一样
建表之后添加外键约束
关于外键约束的等级
默认创建外键约束时用的是NO action方式:即如果子表中有匹配记录,则不允许对父表对应数据进行update或者delete
Cascade方式: 上面演示时,当修改主表主键时候,因子表有关联数据,因此无法更新,但是用了这种方式,update或者delete主表数据时,同步的会update或者delete子表对应的相关数据
Set null方式: 当主表上update/delete记录时候,将子表匹配的记录的列设置为null,注意子表的外键列不能是非空约束(NOT NULL)
演示UPDATE的时候是Cascade方式 DELETE时候是Set null方式
这样的话 UPDATE主表会同步更新子表 删除时候主表数据会把子表数据外键设置为NULL
下面这样 UPDATE主表数据时候会将子表关联数据外键设置为NULL 删除主表数据时候会关联删除子表数据
删除外键约束
开发中要不要用外键约束呢???? 不建议
检查约束与默认值约束
Mysql8之前并非不支持,就是没有用 他不去检查 加了和没加一个样
修改
主键约束,唯一约束,外键约束的字段都会创建索引
主键索引,唯一索引,外键索引