MySQL:列属性(列约束)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:列属性(列约束)相关的知识,希望对你有一定的参考价值。
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 指的是只有主表的主键发生变化,才会对从表发生影响。
以上是关于MySQL:列属性(列约束)的主要内容,如果未能解决你的问题,请参考以下文章