MySql_Day6—给表加入约束——非空、唯一、主键、外键

1.约束种类

a)非空约束,not null
b)唯一约束,unique
c)主键约束,primary key
d)外键约束,foreign key
e)自定义检查约束,check(不建议使用)(在mysql中现在还不支持)

2.非空约束,not null——针对某个字段,设置其值不为空

  • 设置表t_student中的name字段不为空
  •   create table t_stu(
      no int(10),
      name varchar(20) not null,
      sex char(2) default 'm'
       );
    
  •   insert into t_stu(no,sex) values (20,'f'); 
    

在这里插入图片描述

3.唯一约束,unique——它可以使某个字段的值不能重复

3.1.列级约束
  •   drop table if exists t_stu; 	
      create table t_stu(
      no int(10)  unique,  //不可重复
      class varchar(10),
      name varchar(20) not null,
      sex char(2) default 'm'
       );
    
  •   insert into t_stu(no,class,name,sex) values (20,'senior','zs','f'); 
    
  •   insert into t_stu(no,class,name,sex) values (20,'junior','ww','f'); //报错,字段no的值不可重复
    

在这里插入图片描述

3.2.表级约束(比列级约束要低级)
  •   drop table if exists t_stu; 	
      create table t_stu(
      no int(10)  , 
      class varchar(10),
      name varchar(20) not null,
      sex char(2) default 'm',
      unique(no,class)
       );
    
  •   insert into t_stu(no,class,name,sex) values (20,'senior','zs','f'); 
    
  •   insert into t_stu(no,class,name,sex) values (20,'junior','zs','f'); 
    

在这里插入图片描述

4.主键约束,primary key——既不能为空,也不能重复

  • 每个表应该具有主键,主键可以标识记录的唯一性。一张表的主键约束只能有1个。(必须记住)
  • 主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。
4.0.主键相关的术语?
	主键约束 : primary key
	主键字段 : id字段添加primary key之后,id叫做主键字段
	主键值 : id字段中的每一个值都是主键值。
4.0.1.主键有什么作用?
	- 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
	- 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)
4.0.2. 主键的分类?
  • 根据主键字段的字段数量来划分:
    • 单一主键(推荐的,常用的。)
    • 复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)
  • 根据主键性质来划分:
    • 自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
    • 业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
  • 注意:最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。
4.1.列级,主键约束
  •   drop table if exists t_stu; 	
      create table t_stu(
      no int(10)  primary key, 
      class varchar(10),
      name varchar(20) not null,
      sex char(2) default 'm'
       );
    
  •   insert into t_stu(class,name,sex) values ('senior','zs','f'); 
    

在这里插入图片描述

  •   insert into t_stu(no,class,name,sex) values (20,'senior','zs','f'); 
    
  •   insert into t_stu(no,class,name,sex) values (20,'junior','ww','m'); 
    
  • 报错:
    在这里插入图片描述
4.2.表级,主键约束
  •   drop table if exists t_stu; 	
      create table t_stu(
      no int(10)  , 
      class varchar(10),
      name varchar(20) not null,
      sex char(2) default 'm',
      primary key(no,class)
       );
    
  •   insert into t_stu(no,class,name,sex) values (20,'senior','zs','f');
    
  •   insert into t_stu(no,class,name,sex) values (20,'junior','ww','m');
    
  •   insert into t_stu(no,class,name,sex) values (20,'junior','ww','m'); // 报错
    
  • 第3句insert会报错
    在这里插入图片描述
4.3.主键自增——primary key auto_increment(非常重要)
  •   drop table if exists t_user;
      create table t_user(
      	id int primary key auto_increment, // id字段自动维护一个自增的数字,从1开始,以1递增。
      	username varchar(255)
      );
      insert into t_user(username) values('a');
      insert into t_user(username) values('b');
      insert into t_user(username) values('c');
      insert into t_user(username) values('d');
      insert into t_user(username) values('e');
      insert into t_user(username) values('f');
      select * from t_user;
    

在这里插入图片描述
提示:Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象。

5.外键约束,foreign key

  • 外键主要是维护表之间的关系的,主要是为了保证参照完整性。
  • 如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键unique修饰的字段
5.1.关于外键约束的相关术语:
*	外键约束: foreign key
  • 外键字段:添加有外键约束的字段

  • 外键值:外键字段中的每一个值。

  • 案例分析:
    建立学生和班级表之间的连接。
    1.首先建立班级表t_classes

  •   drop table if exists t_classes;
      create table t_classes(
      	class_id int(3) primary key,
      	class_name varchar(40)
      )
    
  •   insert into  t_classes(class_id,class_name) values (2020,'BeiJingNo. 1 middle school');
    
  •   insert into  t_classes(class_id,class_name) values (2019,'ShangHaiNo. 2 middle school');
    

在这里插入图片描述

2.再建立学生表t_stu

  •   drop table if exists t_stu; 	
      create table t_stu(
      no int(10)  primary key, 
      name varchar(20) not null,
      class_id int(3),
      foreign key(class_id)  references  t_classes(class_id)
       );
    
  •   insert into t_stu(no,name,class_id) values (20,'ww',2019);
      insert into t_stu(no,name,class_id) values (19,'zs',2020);
    

在这里插入图片描述

  •    insert into t_stu(no,name,class_id) values (20,'ww',1234);
    

foreign key的存在,而报错:
在这里插入图片描述

  • 外键值可以为NULL?
    外键可以为NULL。
    在这里插入图片描述

  • 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
    注意:被引用的字段不一定是主键,但至少具有unique约束。

5.x.子表与父表分析
  • t_stu中的class_id字段引用t_classes表中的class_id字段,此时t_stu表叫做子表。t_classes表叫做父表。
    顺序要求:
    1.删除数据的时候,先删除子表,再删除父表。
    2.添加数据的时候,先添加父表,在添加子表。
    3.创建表的时候,先创建父表,再创建子表。
    4.删除表的时候,先删除子表,在删除父表。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值