MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息;

   约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。

   常用五类约束:

   1、not null:非空约束,指定某列不为空
   2、unique
唯一约束,指定某列和几列组合的数据不能重复
   3、primary key
:主键约束,指定某列的数据不能重复、唯一
   4、foreign key
:外键,指定该列记录属于主表中的一条记录,参照另一条数据
   5、check
:检查,指定一个表达式,用于检验指定数据
   根据约束数据列限制,约束可分为:
   A、单列约束:每个约束只约束一列
   B、多列约束:每个约束约束多列数据

1not null

  非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。

Null类型特征:所有的类型的值都可以是null,包括int、float等数据类型,空字符串””不等于null,0也不等于null
  create table temp(
      id int not null,  
      name varchar(255) not null default‘abc’,  
      sex char null
  )
 上面的table加上了非空约束,也可以用alter来修改或增加非空约束

增加非空约束

  alter table temp modify sex varchar(2) not null;  
取消非空约束
  alter table temp modify sex varchar(2) null;  
取消非空约束,增加默认值
  alter table temp modify sex varchar(2) default ‘abc’;

2unique

   唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。MySQL会给唯一约束的列上默认创建一个唯一索引;

  create table temp (
     id int not null,  
     name varchar(25),
     password varchar(16),
     constraint uk_name_pwd unique(name,password)
  );
  表示用户名和密码组合不能重复

添加唯一约束

  alter table temp add unique(name, password);
修改唯一性约束
  alter table temp modify name varchar(25) unique;
删除约束
  alter table temp drop index name;

【注】:创建索引和创建唯一约束,在mysql的表结构中的表现都是索引,如以下是建的索引

以下是建的唯一性约束

3primary key

   主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。

   MySQL的主键名总是PRIMARY,当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。(在表的界面操作上索引列看不出来,仅使用show index from 表名语句才能看到)
列模式:
   create table temp(
       id int primary key,
       name varchar(25)
   );  

表模式:

  create table temp2(
       id int not null,
       name varchar(25),
       pwd varchar(15),
       constraint pk_temp_id primary key(id)
   );  
组合模式:
   create table temp2(
       id int not null,
       name varchar(25),
       pwd varchar(15),
       constraint pk_temp_id primary key(name,pwd)
   );

alter删除主键约束

   alter table temp drop primary key;  
alter添加主键
   alter table temp add primary key(name, pwd);
alter
修改列为主键
   alter table temp modify id int primary key;
设置主键自增
   create table temp(
       id int auto_increment primary key,
       name varchar(20),
       pwd varchar(16)
   );
   auto_increment
自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。

4foreign key

   外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。也就是说从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。还有一种就是级联删除子表数据。

注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。

当创建外键约束时,系统默认会在所在的列和列组合上建立对应的normal索引。

创建外键约束:

   主表
   create table classes(
       id int auto_increment primary key,
       name varchar(20)
   );
   从表
   create table student(
       id int auto_increment,
       name varchar(22),
       constraint pk_id primary key(id),
       classes_id int,

       foreign key(classes_id) REFERENCES classes(id)

   );

  上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n其中student是表名,n是当前约束从1开始的整数。

指定约束名称:

   create table student(
       id int auto_increment primary key,
       name varchar(25),
       classes_id int,
       constraint fk_classes_id foreignkey(classes_id) references classes(id)
   );

多列外键组合,必须用表级别约束语法:

   create table classes(
       id int,
       name varchar(20),
       number int,
       primary key(name, number)
   );
   create table student(
       id int auto_increment primary key,
       name varchar(20),
       classes_name varchar(20),
       classes_number int,
       foreign key(classes_name,classes_number) references classes(name, number)
   );

删除外键约束:(删除约束,并不会删除创建约束时建立的对应的normal索引)

   alter table student drop foreign keys tudent_ibfk_1;
   alter table student drop foreign key fk_student_id;

增加外键约束

   alter table student111 add foreign key(classes_name, classes_number) references

   classes111(name, number);

   alter table student111 add foreign key(classes_name) references classes111(name);

   alter table student111 add foreign key(classes_number) references classes111(number);

wKioL1NYh8LgEs3YAACS4ctKqcw979.jpg

自引用、自关联(递归表、树状表)

   create table tree(
       id int auto_increment primary key,
       name varchar(50),
       parent_id int,
       foreign key(parent_id) references tree(id)
   );

级联删除:删除主表的数据时,关联的从表数据也删除

1)级联删除:on delete cascade    级联更新:on update cascade

   create tableclasses222(

       id int,

       name varchar(20),

       number int,

       primary key(name, number)

   );

   create tablestudent222(

       id int auto_increment primary key,

       name varchar(20),

       classes_name varchar(20),

       classes_number int,

       foreign key(classes_name,classes_number) references classes222(name, number)

       on delete cascade on update cascade

   );

2)删除/更新设为空:on delete set null,on update set null

   alter table student222 drop foreign key student222_ibfk_1;

   alter table student222 add foreign key(classes_name, classes_number)

   references classes222(name, number) on delete set null on update set null

4)删除/更新不允许:ondelete restrict,on update restrict(默认情况)

   alter table student222 drop foreign key student222_ibfk_1;

   alter table student222 add foreign key(classes_name, classes_number)

   references classes222(name, number) on delete restrict on update restrict

5)删除/更新不允许:on delete no action,on update no action(同默认情况)

   alter table student222drop foreign key student222_ibfk_1;

   alter table student222 add foreign key (classes_name, classes_number)

   references classes222(name, number)on delete no action on update no action

5check

MySQL可以使用check约束,但check约束对数据验证没有任何作用。

   create table temp(
       id int auto_increment,
       name varchar(20),
       age int,
       primary key(id),
       check(age > 20)
   );
上面check约束要求age必须大于20,但没有任何作用。但是创建table的时候没有任何错误或警告。

总结:

主键、unique--------> unique索引

外键、key--------> normal索引