mysql 对属性值作约束_MySQL:列属性(列约束)

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

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

79d13b8e5a106e6b54225d56b775d0d0.png

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

904c9b9ef51d82f10c92b7e2297a045a.png

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

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

585e1ee0f80c54c43eb88bf2edeaea2c.png

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

2. 设置默认值(default value)

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

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

68ad7430a8ee712e7a0899631b7e6e37.png

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

结果如下图:

071dcea25fa07ffdcc6786cd07dbfbd7.png

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

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

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

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

3. 主键|唯一索引

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

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

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

ID

班级

姓名

年龄

1

1520113

张三

24

2

1520114

李四

26

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

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

主键的设置方法:

方案一:字段上设置

6b4830f6db828e930fcf8b827dffdd40.png

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

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

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

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

f29c121caa7b2e093adbdc620604621f.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: 注意说法上的严谨:现在是一个主键上包含了两个字段,而不能说这两个字段都是主键,可以说这两个字段组成了主键。

c625f4b1a206415ad604155c220e9c49.png

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

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

使用auto_increment标识,如下图所示

3ff1a06417cbf2eaf247c685d6fd0cca.png

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

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

5b9ada08aa0bf14b0b128d858c2f7ea5.png

c912211c99778904875177ad57b7a724.png

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

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

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

17465458ab25aa6df216a0c8dcce4b9e.png

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

f51773b49d3387aa5f7ad8e54113ab19.png

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

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

678a70ed2c94a7c25c4269a3caa9e37d.png

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

af6744dfb8b09c290d6cb130fb82ef17.png

4. 外键约束(foreign key)

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

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

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

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

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

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

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

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

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

1f6d488f09f21829ae414e044e8505bb.png

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

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

f5d14fa2cec5e47d1852248c12436a3b.png

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

1c9c2b0364960e6338e37333efdce233.png

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

92233cc6a826aad718958fc09c453761.png

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

① 主表更新:on update

② 主表删除:on delete

允许的级联动作:

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

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

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

修改外键:

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

alter table tb_name drop foreign key (class_id);

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

4d68357370d4e7342af2427fecfd8c81.png

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

94224c60e0d79290be85d41e6014a31d.png

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

2083061782400a810f4c96eb7021713f.png

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

b456bfd8c232c47cb77ff262f104e29f.png

原文:http://www.cnblogs.com/zhqiang/p/6890111.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值