??博主首页:
??专栏首页: 数据库初阶
??其它专栏: C++初阶 | C++进阶 | 初阶数据结构
亲爱的小伙伴们,各人好!在这篇文章中,我们将深入浅出地为各人讲解 MySQL中表的束缚 资助您轻松入门,快速把握焦点概念。
假如文章对您有所启发或资助,请别忘了 点赞 ??、收藏 ??、留言 ?? 支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!
文章目次
- `0. 什么是表的束缚`
- `1. NULL & NOT NULL`
- ??1.1 关键词解释??
- ??1.2 用法示例??
- `2.DEFAULT`
- ??2.1 关键词解释??
- ??2.2 用法示例??
- ??2.3 NOT NULL 和 DEFAULT 区别??
- `3.COMMENT`
- ??3.1 关键词解释??
- ??3.2 用法示例??
- `4.ZEROFILL`
- ??4.1 关键词解释??
- ??4.2 用法示例??
- `5. PRIMARY KEY`
- ??5.1 关键词解释??
- ??5.2 用法示例??
上一篇文章中,博主先容了 :
建议将上一篇文章看完之后再来看这篇文章,链接如下:
【数据库初阶】MySQL数据类型
那么接下来正文开始:
0. 什么是表的束缚
- 上一篇文章中讲过,真正表的束缚其实是 数据类型;
- 但是数据类型束缚很单一,需要有一些 额外的束缚,更好的保证 数据的合法性,从业务逻辑角度 保证数据的精确性。
- 表的束缚有许多,本篇文章主要先容以下几个:
- null / not null,
- default,
- comment,
- zerofill,
- primary key,
- auto_increment,
- unique key
1. NULL & NOT NULL
??1.1 关键词解释??
- NULL 就是空,什么都没有的意思,和语言上的NULL是有点区别的;
- 在数据库创建中,假如从逻辑角度不想让某一个字段(某一列)为空,就要添加束缚条件,NOT NULL。
??1.2 用法示例??
- 例如,在学校中,从逻辑上讲,每个学生的学号都不可能是空值;
- 因此可以将这个字段添加束缚 NOT NULL;
- SQL 代码如下:
mysql> create table if not exists null_test(
-> stu_id varchar(10) not null,
-> stu_name varchar(10),
-> stu_class int
-> );
- 查看一下表结构,输入:desc null_test;
- 此时,必须在这个表中的每一行添加这个字段的值,否则就会报错:
2.DEFAULT
??2.1 关键词解释??
- 在一张表中,某一个字段的值可能 出现的频率比力高;
- 为了避免重复的输入,可以将这个字段添加束缚 DEFAULT 默认值;
- 下次就不需要手动进行插入,会自动添加到表中;
- 假如某一行中此字段的值不是默认值,再手动修改,大大提高了服从。
??2.2 用法示例??
- 例如,在理工类学校中,男生的人数可能比女生的人数要多许多;
- 那么就可以将性别这个字段添加默认值;
- 代码如下:
mysql> create table if not exists default_test(
-> stu_id int not null,
-> gender char(1) default ‘男’,
-> age int unsigned
-> );
Query OK, 0 rows affected (0.05 sec)
- 查看表结构:
- 省略gender字段向表中插入数据,那就是默认值,不省略就可以修改:
??2.3 NOT NULL 和 DEFAULT 区别??
问题1:
- 先来看下面的一个插入方式,为什么在创建的时间 age 字段没有设置默认值,插入的时间也可以被省略?
- 现实上,对于不是 NOT NULL 的字段,MySQL会自动帮我们添加 默认值 NULL,我们可以查看一下MySQL为我们修改的创建表的语法:
问题2:
- 我们可以看到:非空束缚的默认值也是NULL,为什么呢?
- 其实这个NULL的本质是不一样的,假如我们不指定stu_id列插入数据看一下:
- 因此,在定义非空束缚的表中,MySQL不会帮我们自动生成一个默认值;
- 对于带有 NOT NULL 束缚的字段,DESC 中显示的 Default 为 NULL,这并不表示这个字段的默认值是 NULL。现实上,NOT NULL 束缚要求这个字段在插入时不能是 NULL,假如插入时没有提供这个字段的值,MySQL 会报错,报的是没有默认值的错误。
总结:
- 对于是非空束缚的字段:
- MySQL不会帮我们自动生成一个默认值,假如我们在插入数据的时间不显示指定此列,那么编译器就会报没有默认值的错误;
- 假如插入数据的时间显示插入值,但是插入的值是NULL,才会报自此段不能为空的错误。
- 对于不是非空束缚的字段:
- MySQL会自动帮我们生成一个默认值NULL,所以不会报没有默认值的错误。
- 因为只有设置了default的列,才可以在插入值的时间,对列进行省略。
- 一般环境下,default 束缚和 not null 束缚不会一起利用。
3.COMMENT
??3.1 关键词解释??
- comment 表示列形貌,没有现实寄义,专门用来形貌字段,会根据表创建语句保存,用来给程序员或DBA来进行了解;
??3.2 用法示例??
- 创建一个表,形貌各个列的寄义;
- 代码如下:
mysql> create table if not exists comment_test(
-> name varchar(20) not null comment ‘姓名’,
-> age tinyint unsigned default 18 comment ‘年事’,
-> gender char(1) default ‘男’ comment ‘性别’
-> );
Query OK, 0 rows affected (0.08 sec)
- desc是查不到注释信息的:
- 通过 show create table 可以看到:
4.ZEROFILL
??4.1 关键词解释??
- 还记得在上一篇文章中讲的数据类型 int 吗,在查表的时间后面的数字代表着什么呢?
- 其实没有这个zerofill属性,这个数字是没故意义的;
- 其实这个表示最后用统一的字数显示,假如是 10 10 10,那么最后就是显示 10 10 10位数字,假如现实数字少于 10 10 10 位,就用 0 0 0 补齐,假如多出就不管。
??4.2 用法示例??
- 创建一个表,内里只有 int,一个int(5),另一个int(10) 这个用zerofill束缚;
- 代码如下:
mysql> create table if not exists zerofill_test(
-> a int(5),
-> b int(10) unsigned zerofill
-> );
- 插入数据,代码如下:
mysql> insert into zerofill_test values(1,2);
Query OK, 1 row affected (0.01 sec)
mysql> insert into zerofill_test values(325, 510);
Query OK, 1 row affected (0.01 sec)
- 查表:
mysql> select * from zerofill_test;
±-----±-----------+
| a | b |
±-----±-----------+
| 325 | 0000000510 |
| 1 | 0000000002 |
±-----±-----------+
2 rows in set (0.00 sec)
- 其实int默认是 10 10 10 位也是有原因的,因为它的最大值就是二十一亿多( 10 10 10 位数字),unsigned也就是四十二亿多( 10 10 10 位数字)。
5. PRIMARY KEY
??5.1 关键词解释??
- primary key用来 唯一的 束缚该字段内里的数据,不能重复,不能为空;
- 主键要求表中每一行记载的值都是唯一的,也就是说,主键字段的值不能重复。每行数据的主键值都是唯一的,确保数据的唯一性。
- 主键字段不能为 NULL。也就是说,在定义主键时,MySQL 会自动给该字段添加 NOT NULL 束缚。每一行数据在插入时,主键字段必须提供一个有效的、非空的值。
- 一张表中最多只能有 一个主键,但可以由一个列或多个列构成(复合主键)。
- 主键可以由一列或多列字段构成。一个单列主键称为“单列主键”,而由多个列构成的主键称为“复合主键”。
- 单列主键:表中只有一个字段作为主键。
- 复合主键:多个字段组合成一个主键,保证唯一性。
- 主键所在的列通常是 整数类型。
??5.2 用法示例??
5.2.1 单列主键
- 可以用以下两种方式定义主键:
#方法1:
mysql> create table if not exists primarykey_test(
-> stu_id int,
-> name varchar(20),
-> gender char(2) default ‘男’,
-> primary key(stu_id)
-> );
Query OK, 0 rows affected (0.04 sec)
方法2:
mysql> create table if not exists primarykey_test(
-> stu_id int primary key,
-> name varchar(20),
-> gender char(2) default ‘男’,
-> );
Query OK, 0 rows affected (0.04 sec)
- 查看创建信息:
- 插入信息,发现假如有了主键束缚,此列信息不能重复:
- 可以删除主键,代码如下:
mysql> alter table primarykey_test drop primary key;
Query OK, 1 row affected (0.16 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> desc primarykey_test;
±-------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------±------------±-----±----±--------±------+
| stu_id | int | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | 男 | |
±-------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

- 删除后可以重新添加,但要 保证添加这一列中没有重复的值!!
mysql> alter table primarykey_test add primary key(stu_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc primarykey_test;
±-------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------±------------±-----±----±--------±------+
| stu_id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | 男 | |
±-------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)
5.2.2 复合主键
- 定义方法,代码如下:
- 这个表中定义主键的意思是一个学生可以选择多门课,一门课可以被多名学生选择,但是 不存在一名学生重复选择同样的课的环境。
mysql> create table if not exists primarykey_test2(
-> stu_id int,
-> course_id int,
-> grade int,
-> primary key(stu_id, course_id)
);
Query OK, 0 rows affected (0.04 sec)
- 查看创建信息和表结构:
主键的特点与束缚:
- 每个表只能有一个主键,但是主键可以包含多个字段(即复合主键)。
- 假如表中已经有一个字段被定义为主键,其他字段就不能重复该主键的值。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |