MySQL:表的约束

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

目次
一.   表的约束和约束的目标
二.   空属性
三.   默认值default
四.   列描述
五.   zerofill
六.   主键
6.1   建表时定义主键
6.2   去掉主键
6.3   建表后添加主键
6.4   复合主键
七.   自增长
八.   唯一键
九.   外键

一.   表的约束和约束的目标

表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库中的数据是符合预期的。约束本质是通过技能本领,倒逼步伐员,插入精确的数据。反过来,站在MySQL角度,凡是插入进来的数据,都是符合数据约束的!
约束的终极目标:保证数据的完整性和可预期性
二.   空属性

两个值:null和not null
数据库默认字段根本都是字段为空,但是实际开发时,尽大概保证字段不为空,由于数据为空没办法参与运算。
  1. mysql> select null;
  2. +------+
  3. | NULL |
  4. +------+
  5. | NULL |
  6. +------+
  7. 1 row in set (0.00 sec)
  8. mysql> select 1+null;
  9. +--------+
  10. | 1+null |
  11. +--------+
  12. |   NULL |
  13. +--------+
  14. 1 row in set (0.00 sec)
复制代码

案例:创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:


  • 如果班级没有名字,你不知道你在哪个班级。
  • 如果教室名字为空,就不知道在哪上课。
所以我们在设计数据库表的时候,一定要在表中进行限制,满意上面条件的数据就不能插入到表中。这就是“约束”。
  1. mysql> create table myclass(
  2.   -> class_name varchar(20) not null,
  3.   -> class_room varchar(10) not null);
  4. Query OK, 0 rows affected (0.02 sec)
  5. mysql> desc myclass;
  6. +------------+-------------+------+-----+---------+-------+
  7. | Field     | Type       | Null | Key | Default | Extra |
  8. +------------+-------------+------+-----+---------+-------+
  9. | class_name | varchar(20) | NO   |     | NULL   |       |
  10. | class_room | varchar(10) | NO   |     | NULL   |       |
  11. +------------+-------------+------+-----+---------+-------+
  12. //插入数据时,没有给教室数据插入失败:
  13. mysql> insert into myclass(class_name) values('class1');
  14. ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
复制代码

三.   默认值default

默认值:某一种数据会经常性的出现某个详细的值,可以在一开始就指定好,在必要真实数据的时候,用户可以选择性的使用默认值。
  1. mysql> create table tt10 (
  2.   -> name varchar(20) not null,
  3.   -> age tinyint unsigned default 0,
  4.   -> sex char(2) default '男'
  5.   -> );
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> desc tt10;
  8. +-------+---------------------+------+-----+---------+-------+
  9. | Field | Type               | Null | Key | Default | Extra |
  10. +-------+---------------------+------+-----+---------+-------+
  11. | name | varchar(20)         | NO   |     | NULL   |       |
  12. | age   | tinyint(3) unsigned | YES |     | 0       |       |
  13. | sex   | char(2)             | YES |     | 男     |       |
  14. +-------+---------------------+------+-----+---------+-------+
复制代码
  如果数据在插入时不给定值,则使用默认值。
  如果我们没有明确指定一列要插入,用的是default。如果建表中,对应列默认没有设置default,无法直接插入。

default和not null不冲突,而是互相增补的。
对于not null而言,当用户插入数据的时候,就分为null和合法数据。
对于default而言,当用户忽略这一列的时候,如果设置了default,则使用默认值;如果没有设置default,则报错。
而对于age列:

下来再来看这个:

为什么照旧让插入了呢?

而如果为我们没有在创建表的时候体现声明默认值,MySQL会优化,自动加上默认值为NULL。
四.   列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给步伐员或DBA(数据库管理员)来进行相识。

可以看到通过desc是看不到注释信息的,得用show才气看到。
五.   zerofill

对数字范例后面的长度很渺茫,对于下面这个表:
  1. mysql> show create table tt3\G
  2. ***************** 1. row *****************
  3.       Table: tt3
  4. Create Table: CREATE TABLE `tt3` (
  5. `a` int(10) unsigned DEFAULT NULL,
  6. `b` int(10) unsigned DEFAULT NULL
  7. ) ENGINE=MyISAM DEFAULT CHARSET=gbk
  8. 1 row in set (0.00 sec)
复制代码
插入元素,体现:


如果我们修改在b的后面加上zerofill限定:

zerofill起到一个让一列的元素格式化体现(等宽体现)的作用。好比一个班一百多号同学,编号时,有一位数,有两位、三位数。我们就可以设置zerofill让其等宽。
加上zerofill并不会影响数值大小

而如果我们将int后面的数字变成小于插入的数的位数,会怎么样?


可以看到,如果插入的数的位数大于设置的int后面的数,那么正常插入就行。如果插入的数的位数小于设置的int后面的数,那么就得补0。
所以数据范例后面的数字代表可以表示的最大位数。
六.   主键

6.1   建表时定义主键

primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数范例。

主键是不能发生冲突的:

则证明只要插入表中的元素,主键一定不冲突,则可以根据主键对数据进行增删查改。

6.2   去掉主键

如果想去掉主键:


6.3   建表后添加主键

上面描述的是建表时就在相应数据范例后面表明主键,我们还可以在建表之后再添加主键。

并且建表之后添加主键必要保证在表中必要设置主键的那列元素不能冲突。
6.4   复合主键

前面说过,一张表中最多只有一个主键,但是并不意味着一个主键只能关联一列,一个主键可以关联多列,这种主键就叫做复合主键。

id和couse_id合起来才气称为一个主键。

对于复合主键,只有组成复合主键的数据跟历史数据都一样的时候,才会发生主键冲突。
七.   自增长

auto_increment:当对应的字段,不给值,会自动的被体系触发,体系会从当前字段中已经有的最大值+1操作,得到一个新的差别的值。通常和主键搭配使用,作为逻辑主键。
   自增长的特点:
  

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
  • 自增长字段必须是整数。
  • 一张表最多只能有一个自增长。
  


为什么会如许呢?

   主要是由于方框内的设定,意思是下一次插入没有指定则就是1002。
  那是不是对于每个空表,插入没有指定的值的时候都是从1开始呢?其实我们可以在创建表的时候就指定:

如许就指定初始为500。

也可以直接获取前次插入的auto_increment的值:
  1. mysql > select last_insert_id();
  2. +------------------+
  3. | last_insert_id() |
  4. +------------------+
  5. |                1 |
  6. +------------------+
复制代码
八.   唯一键

创建带有唯一键的表:

唯一键表达了类似于主键的功能,不能发生冲突。

但是,唯一键是可以为空的,这是区别于主键的地方。

主键与唯一键并不冲突,是互相增补的!!!

像如许主键是有唯一性的,这是没问题的。
如果我插入的元素电话列,发生了冲突,但是主键又只能有一个,所以这里就必要唯一键来约束,保证电话的唯一性。
所以把telphone添加成唯一键:
  1. alter table t20 add constraint unique_telphone unique(telphone);
  2. //添加一个名为 unique_telphone 的唯一键约束,并且这个约束应用于 telphone 列。
复制代码
  关于唯一键和主键的区别:
  我们可以简单明白成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
  九.   外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
  1. foreign key (字段名) references 主表(列)
复制代码
案例:


如许的student只是有外键之名(关联关系),但是没有外键之实(没有约束)。重新创建一个。


如许插入一个并不属于class表的班级编号的时候,就会报错。
并且如果从表中对应的还有数据,是不能在主表中删除的。

外键必要留意:
(1)从表和主表的关联关系
(2)产生外键约束

总结:
好了,到这里本日的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。
祝大家越来越好,不用关注我(疯狂暗示)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表