MySQL基础教程——数据类型与表的约束
@
前言
在了解了MySQL关于数据库与表的操作后,我们来继续MySQL关于数据类型与表的约束等相关内容。
一、数据类型
(1) 数值类型
下面我们展示包含数值类型的表然后拿其中个别进行案例介绍,其他的都能触类旁通。

1、tinyint类型
# 有符号
create table t1(num tinyint);
#无符号
create table tt2(num tinyint unsigned);
2、bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
如果我们有这样的值,只存放0或1,这时可以定义bit(1),这样就可以节省空间。

值得注意的是bit字段在显示时,是按照ASCII码对应的值显示。
(2) 小数类型
1、float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
2、decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0。如果m被省略,默认是10。且decimal的精度要比float高。
(3) 字符串类型
1、char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
而在MySQL中无论汉字、字母还是数字都视为一个字符在表中存储。
2、varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
当编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
3、char与varchar区别
char 与 varchar 在输入参数就确定其最大大小。char是定长的,而varchar是变长的,能在于其能够根据实际填入的内容来在最大大小内使用相应大小。定长的磁盘空间比较浪费,但是效率高。变长的磁盘空间比较节省,但是效率低。
(4) 日期类型
date : 日期 'yyyy-mm-dd' ,占用三字节
datetime : 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp : 时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
(5) enum和set
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。


二、表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
(1) 空属性
null(默认的)和 not null(不为空)

可见在not null约束下,插入数据时,没有给教室数据插入会失败。
(2) 默认值 default

数据在插入的时候不给该字段赋值,就使用该默认值。值得注意的是 not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空。
(3) 列描述 comment
comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
mysql> create table person(
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 0 comment '年龄',
-> sex char(2) default '男' comment '性别');
通过desc查看不到注释信息,通过show可以看到。

(4) zerofill
mysql> create table t1(
-> a int(10) unsigned,
-> b int(10) unsigned
-> );
其实没有zerofill这个属性,int(10) 括号内的数字是毫无意义的。

在填加了zerofill属性后可见下面效果,如果有zerofill属性的数据宽度小于设定的宽度(这里设置的是5),就会自动填充0。

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

一张表中最多只能有一个主键,但主键可添加多个字段为复合主键。

(6) 自增长 auto_increment
其当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值进行+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。然后自增长字段必须是整数,且整张表最多只能有一个自增长。

(7) 唯一键 unique
一张表中有往往有很多字段需要唯一性,数据不能重复,而unique就可以解决这个问题。唯一键的本质和主键差不多,但唯一键允许为空,而且可以多个为空,而空字段不做唯一性比较。
(8) 外键 foreign key
外键是用于定义主表和从表之间的关系。外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
foreign key (字段名) references 主表(列)

结语
以上就是MySQL数据类型与表的约束的基本内容了。如果喜欢我的内容,请点赞、收藏加关注,多多支持我这个编程小白啊,以及欢迎各位在评论区讨论交流,并指出我的不足,谢谢大家。

浙公网安备 33010602011771号