mysql属性及约束_MySQL:列属性(列约束)

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

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

a68fb691477b5361aadcd19fd818a9ca.png

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

9fe8c1bf448ad659211d8a52bef799b1.png

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

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

0a2588ec4192331d181e209e94405a1d.png

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

2. 设置默认值(default value)

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

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

ede812825542aa92087a44cbd8dc1d72.png

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

结果如下图:

94d9c73077d719692c5d8ab9bb3d98a8.png

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

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

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

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

3. 主键|唯一索引

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

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

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

ID

班级

姓名

年龄

1

1520113

张三

24

2

1520114

李四

26

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

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

主键的设置方法:

方案一:字段上设置

114dfdf5c35813acc90d1950d15ef32c.png

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

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

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

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

629aab2749a08fa8ad4db7e7879e9811.png

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

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

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

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

99ccf3a79985482d21d58c37bb09326e.png

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

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

使用auto_increment标识,如下图所示

c825efc573be7eb095f0d9e815820827.png

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

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

85e86a878dfc10fa92c94e2c14019957.png

ffe4b9939ab7fe931ff5fcecdfbfe230.png

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

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

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

7da69cf2db5b0e0c95e5c1ce4e74ac0a.png

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

92d4974356267a807d7ab70d6569eefb.png

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

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

1dd820126cb9227e936280647d0ec220.png

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

fe96aa85b999f8c8047a90544f15fdd7.png

4. 外键约束(foreign key)

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

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

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

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

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

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

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

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

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

13462968e5bf3ce686c8832d1b899a55.png

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

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

de72d4fc692db3ffa218a08833129c6c.png

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

7334cc09fb75d56ea5f53b6c3ec3d7bb.png

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

93312616b948318599a698c7a70b82d8.png

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

① 主表更新:on update

② 主表删除:on delete

允许的级联动作:

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

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

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

修改外键:

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

alter table tb_name drop foreign key (class_id);

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

dc1ddb63c92830959dc54fbaddfc58f0.png

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

3772d814fa9a11c7b46ccc476d702f39.png

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

2747599c11366ceccdabf553bc2ac6cf.png

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

6522b249b09cb33e2e64de75eedda5be.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值