约束(constraint)

1、【什么是约束】:

           约束对应的英文是'constraint'。在创建表的时候,我们可以给表中的某些字段加上一些约束。来保证这个表中数据的完整性、有效性及合法性。

      【约束的作用】:就是保证表中的数据有效!

2、【约束包括哪些】:

           非空约束:  not null      需要掌握

           唯一性约束:unique        需要掌握

           主键约束:  primary key   需要掌握

           外键约束:  foreign key   需要掌握

           检查约束:  check(mysql不支持  Oracle支持)

3、【非空约束:not null】

         非空约束not null约束的字段不能为null

         例如:

         drop table if exists t_vip;                 #如果存在表t_vip就删除。

         create table t_vip(                           #创建表t_vip

               id int,                                         #字段名为id 类型为int

               name varchar(255) not null    #字段名为name,类型varchar,not null约束该字段不能为空

          );

4、【唯一性约束:unique】

         唯一性约束的字段不能重复,但是可以有多个null或者全是null。

         drop table if exists t_vip;                 #如果存在表t_vip就删除。

         create table t_vip(                           #创建表t_vip

             id int,                                           #字段名为id 类型为int

             name varchar(255) unique         #字段名为name,类型varchar,  unique约束该字段不能重复

         );

       【name字段虽然被unique约束了,但是可以都为null。】

         新需求:要求两个字段联合唯一(id和name联合唯一)

         drop table if exists t_vip;          #如果存在表t_vip就删除。

         create table t_vip(                    #创建表t_vip

             id int,                                    #字段名为id 类型为int

             name varchar(255),             #字段名为name,类型varchar

             email varchar unique,          #字段名email,类型varchar,unique表示唯一性约束(列级约束)

             unique(id,name)                   #表示id和name两个字段联合唯一   (表级约束)

             );

          【unique 和 not null 也可以联合使用】

           drop table if exists t_vip;                            #如果存在表t_vip就删除。

           create table t_vip(                                      #创建表t_vip

                  id int,                                                   #字段名为id 类型为int

                  name varchar(255) not null unique     #表示name字段不能为空,也不能重复.name自动成为主键        

                  );

          注意:在mysql中,如果一个字段被not null和unique同时约束,该字段自动变成主键字段.(oracle中不一样)也可以直接进行主键约束primary key。

5、主键约束:

      相关术语:

             主键约束:primary key

             主键字段:添加了主键约束的字段叫做主键字段

             主键值:主键字段中的每一个值都叫主键值

      主键作用:

             主键值是每一行记录的唯一标识,是每一行记录的身份证。

    【记住:任何一张表都应该有主键,没有主键,表无效!】

    【主键的特征:不能为空,也不能重复】

    主键的分类

          * 根据字段数量划分

                 - 单一主键  (推荐使用)

                 - 复合主键  (不推荐使用)

          * 根据主键性质划分

                 - 自然主键  主键值是一个自然数,和业务没有关系。(推荐使用)

                 - 业务主键  主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键。(不推荐使用)

     添加主键约束:(一个字段做主键叫做单一主键)

             drop table if exists t_vip;  #如果存在表t_vip就删除。

             create table t_vip(                   #创建表t_vip

                   id int primary key,               #对id字段添加了主键约束,id字段成为了主键字段(列级约束)

                   name varchar(255)        

            );

          还可以这样添加主键约束:

             drop table if exists t_vip;            #如果存在表t_vip就删除。

             create table t_vip(                      #创建表t_vip

                   id int,                                      #字段名为id 类型为int

                   name varchar(255),

                   primary key(id)                      #这样添加主键约束也是可以的  (表级约束)

           );

         多个字段联合做主键叫做复合主键。

             drop table if exists t_vip;        #如果存在表t_vip就删除。

             create table t_vip(                                 #创建表t_vip

                   id int,                                                     #字段名为id 类型为int

                   name varchar(255),

                   primary key(id,name)                  #两个字段联合做主键称为复合主键  (表级约束)

           );

         结论:一张表主键约束只能添加一个。(也就是主键只能有一个)

         主键值建议使用:int、bigint、char等类型.不建议使用varchar做主键.主键值一般都是数字定长的.

               在实际开发中自然主键使用较多,因为主键只要做到不重复就行,不需要有意义。业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以不建议使用业务主键,尽量使用自然主键。

         在mysql中,有一种机制,可以帮助我们自动维护一个主键值:(auto_increment自增,从1开始,以1递增

         举例:

         drop table if exists t_vip;                            #删除表

         create table t_vip(

               id int primary key auto_increment,       #id做主键,并且自增(新增记录时只写name,id会自动添加)

               name varchar(255)

         );

             添加记录:

                 insert into t_vip(name) values ('zhangsan');

                 insert into t_vip(name) values ('lisi');

                 insert into t_vip(name) values ('wangwu');

                 insert into t_vip(name) values ('zhaoliu');

                 insert into t_vip(name) values ('xiaohua');                 #会自动添加主键值1、2、3、4、5

6、外键约束:(foreign key,简称FK)(非常重要 五颗星 *****)

             相关术语:

                     外键约束:一种约束(foreign key)

                     外键字段:该字段上添加了外键约束

                     外键值:外键字段当中的每一个值

        相关知识扩展:

               表文件字段分类:主键字段、非主键字段、外键字段

               主键字段:用于存放主键编号的字段,每张表都应该存在一个主键字段。主键编号相当于身份证编号,用于对表文件中数据行身份进行确认,主键字段既不能为null也不能重复。  

               非主键字段:用来描述主键字段

               外键字段:外键字段只存在于【多方表】中,描述多方数据与一方数据之间的依赖关系。外键字段的值应该来源于一方表中的某个字段的值。但是可以存储null值。

        举例:

                  业务需求:设计数据库表,来描述“班级和学生”的信息

                  第一种方案:信息存储在一张表中

                    no(PK)         name           classno                       classname

                    -------------------------------------------------------------------------------

                       1                jack                 101            秦皇岛市第二中学高三1班

                       2                make              101            秦皇岛市第二中学高三1班

                       3                mali                 101            秦皇岛市第二中学高三1班

                       4                lisi                   102            秦皇岛市第二中学高三2班

                       5                lili                    102            秦皇岛市第二中学高三2班

                       6                lima                 102            秦皇岛市第二中学高三2班

                    分析上面这张表:数据冗余,空间浪费,设计失败!

                   第二种方案:班级一张表、学生一张表

                    t_class 班级表

                                    classno(PK)                          classname

                               ------------------------------------------------------------

                                         101                       秦皇岛市第二中学高三1班

                                         102                       秦皇岛市第二中学高三2班

                       t_student 学生表

                                       no(PK)               name          cno(班级编号)

                                ------------------------------------------------------------------

                                          1                       jack              101           

                                          2                       make            101           

                                          3                       mali              101           

                                          4                       lisi                102           

                                          5                       lili                 102           

                                          6                       lima              102  

           当cno字段没有任何约束的时候,可能会出现一个100这样的无效数据,因为100班级不存在,所以为了保证cno字段中的值不出现无效数据,需要给cno字段添加外键约束。这样cno字段就是外键字段,cno字段中的每一个值都是外键值。

                 注意:t_class是父表    t_student是子表

                       创建表的顺序:先创建父表,再创建子表。

                       删除表的顺序:先删除子表,再删除父表。

                       插入数据的顺序:先插入父表数据,再插入子表数据。

                       删除数据的顺序:先删除子表数据,再删除父表数据。

       编写sql语句创建t_class 班级表和t_student 学生表:

              drop table if exists t_student;                       #如果存在表t_student就删除(先删子)

              drop table if exists t_class;                          #如果存在表t_class就删除     (后删父)

              create table t_class(                                    #创建表t_class    (先建父)

                     classno int primary key,                        #classno字段数据类型为int 并设置为主键

                     classname varchar(255)                       #classname字段数据类型为varchar长度255

                    );

              create table t_student(                                  #创建表t_student   (后建子)

                     no int primary key auto_increment,        #no字段数据类型为int 并设置为主键 且自增。

                     name varchar(255),                               #name字段数据类型为varchar长度255

                     cno int,                                                   #cno字段数据类型应该与classno保持一致都是int

                     foreign key(cno) references t_class(classno)    #cno字段设置外键约束,引用t_class表的classno

                     );

       向表t_class中添加记录:

               insert into t_class(classno,classname) values(101,'北京大兴区蚂蚁庄第二中学高三1班');

               insert into t_class(classno,classname) values(102,'北京大兴区蚂蚁庄第二中学高三2班');

       向表t_student中添加记录:

               insert into t_student(name,cno) values('jack',101);      #因为no字段是自增的,可以不写

               insert into t_student(name,cno) values('make',101);

               insert into t_student(name,cno) values('mali',101);

               insert into t_student(name,cno) values('lisi',102);

               insert into t_student(name,cno) values('lili',102);

               insert into t_student(name,cno) values('lima',102);      

       思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

             答:不一定是主键,但是必须具有unique约束,也就是唯一性约束。

             外键值也可以为null。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值