mysql 数据库约束(constraint)-初学教程
约束的目的:对表中的数据进行条件限制,保证表中的记录完整和有效性
非空约束(not null)
唯一性约束(unique)
组合使用 not null 和 unique
主键约束PK(primary key)
外键约束FK(foreign key)
级联更新与级联删除
ps:创建表结构时,约束条件直接跟在字段后面的为列级约束,若约束条件是用括号时为表级约束。使用表级约束给多个字段联合添加约束,如:unique(name,email)名字和邮箱这两个字段不能同时重复。
表级约束还可以给约束起名字,这样可以便于后期操作这个约束(如,删除
非空约束(not null)
作用:not null约束的字段不能为 NULL 值,必须赋具体数据;
案例:创建t_user 表(id,name,email),name不为空
> create table t_user(id int(10) ,name varchar(32) not null,email varchar(128));
唯一性约束(unique)
作用:unique约束的字段具有唯一性,不可重复,但是可以为空(null)。
案例:修改之前的t_user表结构,把email设置为唯一性
> alter table t_user modify email varchar(128) unique;
组合使用 not null 和 unique(表级约束)
1,使用表级约束给多个字段联合添加约束,如:unique(name,email)名字和邮箱这两个字段不能同时重复,但是名字和邮箱字段可以单独重复。
2,可以给表级约束起名字,这样可以便于操作这个约束(如,删除,修改等)
案例:给约束条件添加名字
> show databases;
> use information_schema;
> show tables;
table_constraints 该表专门存储约束信息
查看某张表存在哪些约束条件?
3,not null 和unique同时使用在列级约束
作用:被 not null 和 unique 约束的字段,该字段即不能为 NULL 也不能重复;
//发现添加数据时,name字段不能空也不能重复。
主键约束PK(primary key)
1,主键涉及到的术语:主键约束,主键字段,主键值
2,主键约束、主键字段、主键值三者之间关系?
-表中某个字段添加主键约束之后,该字段被称为主键字段
-主键字段中出现的每一个数据都被称为主键值;
ps:主键值必须不能为空值,具有唯一性,会自动添加索引,且具有该行数据的唯一标识。一张表只能有一个主键约束。
3,主键的作用:
-添加主键primary key的字段即不能重复也不能为空,效果与“not null nuique”相同,但本质是不同的,添加主键约束之后,主键不仅会有“not null unique”作用,而且主键字段还会自动添加“索引 — index”;
-一张表应该有主键,若没有,表示这张表是无效的。“主键值”是当前行 数据的唯一标识,“主键值”可以是当前行数据的身份证号;(即使表中两行数据完全相同,但是由于主键不同,我们也认为这是两行完全不同的数据)
4,主键根据个数分类:单一主键、复合主键
-给一个字段添加一个主键约束,被称为单一主键
-给多个字段联合添加一个主键约束,被称为复合主键
ps:不论时单一主键还是复合主键,一张表只能有一个主键约束。
案例:如何创建单一主键/复合主键?
*a单一主键:列级约束
*b单一主键:表级约束
//给主键重命名的方式
*c复合主键:只能为表级约束
5,主键根据性质分类:
-自然主键:主键值若是一个自然数,并且这个自然数与业务没有任何关系,这种主键称为自然主键;
-业务主键:主键值若和当前表中的业务紧密相关,那么这种主键值被业务主键;如果业务发生改变时,业务主键往往会受到影响,所以业务主键使用较少,大多情况使用自然主键。
6,MySQL中自动生成主键值(使用自增字段auto_increment)
MySQL数据库管理系统中提供了一个自增数字,专门用来自动生成主键值,主键值不需要用户去维护,也不需要用户生成,MySQL会自动生成。自增数字默认从1开始,以1递增:1、2、3、4、…(Ps:自动生成后,一个主键自然数只能出现一次,若删除该行纪录,重新递增纪录时,主键自然数会跳过直接+1)
外键约束FK(foreign key)
1,外键涉及到的术语:外键约束,外键字段,外键值
2,外键约束,外键字段,外键值之间的关系?
某个字段添加外键约束之后,该字段为外键字段,外键字段中的每一个数据都是外键值。
3,外键根据个数分类:单一外键【给一个字段添加外键约束】和复合外键【给多个字段联合添加成一个外键约束】
Ps:
注:一张表中可以有多个外键字段。
注:外键值可以为空值NULL。
注:外键字段引用一张表的某个字段时,被引用的字段必须具有unique约束。
注:有了外键引用之后,表分为父表和子表。一对多关系中,一为父表,多为子表。创建表时,先创建父表,再创建子表;插入数据时先插入父表中的数据,再插入子表中的数据;删除数据时,需先删除子表的数据,再删除父表的数据。
注:外键约束没有列级约束,只有表级约束。
4,案例说明
案例一,请设计数据库表用来存储学生和班级信息
以下父表:班级表 t_class; 子表是:学生表 t_student;
案例2:找出每个学生的班级名称
> select s.*,c.* from t_student s join t_class c on s.classno=c.cno;
> select sname,cname from t_class join t_student on cno=classno;
级联更新与级联删除
-添加级联更新和级联删除时需要在外键约束后面添加
-在删除父表中的数据时,级联删除子表中的数据 on delete cascade
-在更新父表中的数据时,级联更新子表中的数据 on update cascade
-以上的级联更新和级联删除谨慎使用,因为级联操作会将数据改变或删除【数据无价】
-在修改约束条件时,建议可以将原先的约束删除再重新添加约束条件,案例如下
案例:
删除外键约束:
添加级联删除的外键约束:
添加级联更新的外键约束: