首页 > 技术文章 > MySQL:列属性(列约束)

zhqiang 2017-05-23 12:06 原文

 1. 是否允许为空(Null/not Null)

    规定一个字段的值是否可以是null。默认是可以为空。

    

    此时,插入值a = 10 , b 为空,发现可以正确插入:

    

    若试图插入值b = 11,而a 不做处理,发现不能正确插入,提示 a 没有默认值。

    即当对某个字段未输入信息时,列属性趋向于先查找有无默认值。

   

   tip: NULL与空字符串不同,Null会占用空间,需要表示某些字段可以为NULL。

2. 设置默认值(default value)

     当插入数据中,有空字段时,会尝试查找该字段有没有设置默认值。

    若提前设置了默认值,则会使用默认值。如下图:

    

   当只插入a = 11时,b 由于不允许为NULL,查找默认值,并设置b = 20.

    结果如下图:

    

    只插入b = 11,也是同样的道理。

    tip: 若给某字段插入的值为NULL,则显示会是NULL,而不会选择默认值;

         当且仅当没有给该字段插入值,并且有默认值时,才会启用默认值。

       默认值常用的情况是:该字段不能为空,会设置默认值。

3. 主键|唯一索引

   主键(PK : primary key):在创建表时,可以唯一标识某条记录的字段或字段集合。

                                         可以是真实实体的属性,如身份证号,但常用解决方案是利用一个与实体信息不相关的属性,作为唯一标识

                                         主键不与业务逻辑发生关系,只用来标识记录。

ID 班级 姓名 年龄
1 1520113 张三 24
2 1520114 李四 26

    对于上表,姓名和年龄可能会出现重复,不能作为主键;

   若没有ID,而其他个字段单独都可能出现重复,可以考虑组合其中某几个字段(如班级+姓名),实现唯一标识。

   主键的设置方法:

  方案一:字段上设置

     

     此时,若试图再次插入一个t_id为1的数据时,会提示错误,主键不能重复。

     另外,主键t_id也不可以设置为NULL,虽然并未设置NOT NULL。

     但是若类型允许,可以为负值,只要满足唯一标识原则。

     查询表,会发现t_id已被设为主键。

     

   方案二:在建表的最后声明

1 create table teacher1(
2 t_id int,
3 t_name varchar(5),
4 class_name varchar(6),
5 days tinyint unsigned,
6 primary key (t_id)    //在定义的末尾注明主键是上述的哪个字段
7 );

   方案二的优势:可以标注多个字段作为组合主键

   tip: 注意说法上的严谨:现在是一个主键上包含了两个字段,而不能说这两个字段都是主键,可以说这两个字段组成了主键。

   

tip: 自动增长机制(为每条记录提供一个唯一的标识)

      每次插入记录时,将某个字段的值自动加一。

      使用auto_increment标识,如下图所示

   

   对于设置了auto_increment的主键而言,当输入数据时,若把该字段的值设为NULL,或者不输入该字段内容。

   系统都会以自动增加的形式,为数据编号,如下图:

   

   

tip: 其实不是主键的字段,也可以设置为auto_increment。

另外,自动增长的初始值是可以设置的,默认是1.

通过alter 语句进行更改,如下图:

  

此时再插入数据,不设置主键的值,会发现结果如下:

tip:当设置的N的值,小于当前主键的值时,则可以设置成功,但是实际仍然会基于现有的主键值进行自动增长。

question: 设置了auto_increment后,是否还可以手动插入主键的值?YES!!只要不发生冲突。

   

能否更新当前的数据?YES,利用update语句。

   

4. 外键约束(foreign key)

    若一个实体的某个字段指向另一个实体的主键,eg. student表的字段class_id指向class表的主键class_id。

    就成当前student实体的class_id是外键。

    被指向的实体,称为主实体,也叫父实体。class

    负责指向的实体,称为从实体,也叫子实体。student

作用:用于约束处于关系内的实体

        ① 增加子表记录时,是否有与之对应的父表记录;

        ② 删除or更新父表记录时,子表应该如何处理相关的记录;

定义:在子表上增加外键字段,指向父表的主键。

       建立it_class表,设置字段class_id为主键:

   

      建立itcast_student表,定义字段class_id,并设置它为外键,指向it_class表中的主键字段class_id。

      语句为 foreign key (字段名) references 父表名 (父表主键);

   

   若要在itcast_student表中,插入数据,但该学生所指的班级不存在,会导致创建不成功:

   

   可以在父表it_class中插入数据,即使子表中没有指向其主键的数据:

   

级联操作:当主表数据改变时,与之关联的从表数据应该如何处理。

① 主表更新:on update

② 主表删除:on delete

允许的级联动作:

① cascade:如果主表被更新or删除,则从表也会执行相应的操作。

② set null:若主表记录被删除,则从表相应记录设置为null。表示从表不指向任何主表记录。

③ restrict:拒绝主表的相关操作。

 

修改外键:

   先删除,再新建,通过修改表来完成。

   alter table tb_name drop foreign key (class_id);

   删除外键需要通过指定外键名称来达到目的,可以通过在创建外键时,指定名称,也可以使用MySQL默认生成的名称。

  

   新建外键,指定允许的级联动作为set null:

   

   此时若删除父表it_class中编号为1的记录时,会发现与之关联的从表itcast_student中相应的记录处,变成了NULL:

   

on update 指的是只有主表的主键发生变化,才会对从表发生影响。

 

推荐阅读