约束是表级的强制规定.

什么是约束:对表中字段的限制

为什么需要约束:

为了数据完整性(精确性,可靠性).防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的.

非空约束:NOT NULL

唯一约束:UNIQUE

主键约束:PRIMARY KEY

外键约束:FOREIGN KEY

检查约束:CHECK

默认约束:DEFAULT

约束的区分:

从字段的个数上区分:

单列约束             

多列约束

从约束作用范围讲: 

列级约束:声明在对应字段的后面          

表级约束:在表中所有字段都声明完之后,在所有字段的后面声明的约束   

mysql控制一部分数据写入一部分数据不写入_外键约束

如何添加约束:

一般是在创建表的时候,如果表已经创建通过ALTER TABLE增加或删除约束

#如何查看约束
SELECT * FROM information_schema.TABLE_CONSTRAINTS  WHERE xxxx

mysql控制一部分数据写入一部分数据不写入_字段_02

非空约束: NOT NULL       限制某个字段的值不能是null    默认都是DEFAULT NULL

mysql控制一部分数据写入一部分数据不写入_外键约束_03

NOT NULL 没有表级约束的写法,只有列级约束

如何添加非空约束:

CREATE TABLE test1 (
    id INT,
    last_name VARCHAR ( 20 ) NOT NULL,
    email VARCHAR ( 20 ) NOT NULL,
salary DECIMAL ( 10, 2 ))

mysql控制一部分数据写入一部分数据不写入_外键约束_04

mysql控制一部分数据写入一部分数据不写入_主键_05

mysql控制一部分数据写入一部分数据不写入_字段_06

当然加了非空约束之后,UPDATE的时候 也会限制将非空约束字段修改为NULL    报错

修改约束

mysql控制一部分数据写入一部分数据不写入_数据库_07

唯一约束:  UNIQUE  用来限制某个字段的值在整张表中不能重复

注意:::::允许值为NULL  而且可以多个值为NULL

mysql控制一部分数据写入一部分数据不写入_数据库_08

如何添加唯一约束:  

列级约束    表级约束

mysql控制一部分数据写入一部分数据不写入_主键_09

用ALTER添加或修改唯一约束

如果需要指定约束名: 用CONSISTENT

ALTER table test3 ADD CONSISTENT uk_test3 UNIQUE(last_name) 

注意是后期添加唯一约束时候,保证表里数据唯一性,不能会报错

mysql控制一部分数据写入一部分数据不写入_数据库_10

复合唯一约束

mysql控制一部分数据写入一部分数据不写入_主键_11

mysql控制一部分数据写入一部分数据不写入_字段_12

删除唯一约束

删除唯一约束  其实就是删除唯一索引

mysql控制一部分数据写入一部分数据不写入_数据库_13

mysql控制一部分数据写入一部分数据不写入_数据库_14

mysql控制一部分数据写入一部分数据不写入_主键_15

mysql控制一部分数据写入一部分数据不写入_字段_16

mysql控制一部分数据写入一部分数据不写入_主键_17

mysql控制一部分数据写入一部分数据不写入_字段_18

主键约束: PRIMARY KEY    用来唯一标识表中的一行记录

主键约束相当于唯一约束+非空约束的组合 :主键不允许重复且非空

mysql控制一部分数据写入一部分数据不写入_数据库_19

这里错了   因为一张表主键只有一个  因此  无需命名   即使命名了  其主键名都是PRIMARY

原因也很简单  因为一张表只能有一个主键  所以不需要命名

mysql控制一部分数据写入一部分数据不写入_外键约束_20

mysql控制一部分数据写入一部分数据不写入_数据库_21

mysql控制一部分数据写入一部分数据不写入_主键_22

mysql控制一部分数据写入一部分数据不写入_数据库_23

mysql控制一部分数据写入一部分数据不写入_外键约束_24

复合主键约束:把多个字段当一组   做为主键   但是没个字段都不能是null

mysql控制一部分数据写入一部分数据不写入_字段_25

mysql控制一部分数据写入一部分数据不写入_主键_26

添加主键

mysql控制一部分数据写入一部分数据不写入_外键约束_27

删除主键约束:属于没事找事

mysql控制一部分数据写入一部分数据不写入_字段_28

自增列: AUTO_INCREMENT

自增列一般都会添加到主键上, 唯一约束列也可以,一个表中只能有一个自增长列

自增列数据类型必须为整型(不能单独添加到一列上,必须和主键约束或唯一约束一起使用且字段类型必须为整形)

mysql控制一部分数据写入一部分数据不写入_主键_29

mysql控制一部分数据写入一部分数据不写入_主键_30

mysql控制一部分数据写入一部分数据不写入_外键约束_31

外键约束:FOREIGN KEY  外键约束    一个表中可以声明多个外键约束

作用:限定某张表的某个字段的引用完整性

一个表的外键,关联了另外一张表的主键,如果这个外键的值在另外一张表中主键没有这个值就无法插入,一般我们称外键的这张表为子表,关联主键的表为主表(父表)

在删除主表记录(数据)前要先删除子表关联数据

在向子表插入数据时,外键值必须是主表有的值(如果主表没有该值,报错)

mysql控制一部分数据写入一部分数据不写入_外键约束_32

必须引用主表的主键或者唯一约束列

mysql控制一部分数据写入一部分数据不写入_数据库_33

数据表

链接:https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 
提取码:b0rp 
--来自百度网盘超级会员V5的分享

像上面表中员工表 有三个外键   分别是job_id     department_id   manager_id关联的是自己的id主键

关键名字和对应表名可以不一样,类型必须一样  

mysql控制一部分数据写入一部分数据不写入_字段_34

mysql控制一部分数据写入一部分数据不写入_主键_35

mysql控制一部分数据写入一部分数据不写入_字段_36

mysql控制一部分数据写入一部分数据不写入_主键_37

mysql控制一部分数据写入一部分数据不写入_外键约束_38

mysql控制一部分数据写入一部分数据不写入_数据库_39

mysql控制一部分数据写入一部分数据不写入_字段_40

mysql控制一部分数据写入一部分数据不写入_主键_41

mysql控制一部分数据写入一部分数据不写入_数据库_42

建表之后添加外键约束

mysql控制一部分数据写入一部分数据不写入_外键约束_43

mysql控制一部分数据写入一部分数据不写入_外键约束_44

mysql控制一部分数据写入一部分数据不写入_外键约束_45

关于外键约束的等级

默认创建外键约束时用的是NO action方式:即如果子表中有匹配记录,则不允许对父表对应数据进行update或者delete

Cascade方式:  上面演示时,当修改主表主键时候,因子表有关联数据,因此无法更新,但是用了这种方式,update或者delete主表数据时,同步的会update或者delete子表对应的相关数据

Set null方式: 当主表上update/delete记录时候,将子表匹配的记录的列设置为null,注意子表的外键列不能是非空约束(NOT NULL)

演示UPDATE的时候是Cascade方式     DELETE时候是Set null方式

这样的话 UPDATE主表会同步更新子表   删除时候主表数据会把子表数据外键设置为NULL

mysql控制一部分数据写入一部分数据不写入_字段_46

下面这样  UPDATE主表数据时候会将子表关联数据外键设置为NULL   删除主表数据时候会关联删除子表数据

mysql控制一部分数据写入一部分数据不写入_数据库_47

删除外键约束   

mysql控制一部分数据写入一部分数据不写入_数据库_48

开发中要不要用外键约束呢????  不建议

mysql控制一部分数据写入一部分数据不写入_主键_49

mysql控制一部分数据写入一部分数据不写入_主键_50

检查约束与默认值约束

mysql控制一部分数据写入一部分数据不写入_数据库_51

Mysql8之前并非不支持,就是没有用  他不去检查  加了和没加一个样

mysql控制一部分数据写入一部分数据不写入_主键_52

mysql控制一部分数据写入一部分数据不写入_主键_53

mysql控制一部分数据写入一部分数据不写入_主键_54

mysql控制一部分数据写入一部分数据不写入_外键约束_55

修改

mysql控制一部分数据写入一部分数据不写入_外键约束_56

mysql控制一部分数据写入一部分数据不写入_数据库_57

mysql控制一部分数据写入一部分数据不写入_主键_58

mysql控制一部分数据写入一部分数据不写入_主键_59

主键约束,唯一约束,外键约束的字段都会创建索引

主键索引,唯一索引,外键索引

mysql控制一部分数据写入一部分数据不写入_外键约束_60