写在前面:
本篇博客主要对在学习数据库表的设计时对:数据类型做了简单的介绍、主要对设计表中的属性时的一些约束做了详细的整理:NULL和NOT NULL约束、UNIQUE 唯一约束、DEFAULT默认值设置、主键设置 PRIMARY KEY 、外键设置 FOREIGN KEY 、CHECK约束做了简单详细的介绍以及示例。
1、数据库约束
我们知道在可视化的界面上创建表是如下:
备注:这个是 Navicat for Mysql 可以用于连接Mysql 是一款可视化的界面,更加方便操作。
这里可以看到在建表的时候,这里有名 也就是属性
类型 就是属性的类型,
数值类型
数据类型 | 大小 | 说明 |
---|---|---|
BIT[ (M) ] | M指定位 数,默认 为1 | 二进制数,M范围从1到64, 存储数值范围从0到2^M-1 |
TINYINT | 1字节 | |
SMALLINT | ||
INT | 4字节 | |
BIGINT | 8字节 | |
FLOAT(M, D) | 4字节 | 单精度,M指定长度,D指定 小数位数。会发生精度丢失 |
DOUBLE(M, D) | 8字节 | |
DECIMAL(M, D) | M/D最大 值+2 | 双精度,M指定长度,D表示 小数点位数。精确数值 |
NUMERIC(M, D) | M/D最大 值+2 | 双精度,M指定长度,D表示 小数点位数。精确数值 |
这些数据类型是为了在设计数据类型以及长度的时候更加合理的对内存进行规划,减少不必要的内存开支,使存储的数据的类型更加的合理,规范。
数据类型使用举例:
注意:
数值类型可以指定为无符号(unsigned),表示不取负数
1字节(bytes)= 8bit。
对于整型类型的范围:
1.有符号范围:-2^(类型字节数8-1) 到(类型字节数8-1)-1,如int是4字节,就 是-2^31 到 2^31-1
2.无符号范围:0到2^(类型字节数*8)-1 int就是2^32-1 尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其 如此,还不如设计时,将int类型提升为bigint类型
例如这里的 float(6,3) 指定的是6位长度,保留小数点后3位 当插入一个数据长度为8小数点后4位时就会出现错误。
但是这里可以看到的是当不足六位的时候小数点后面会自动的补上0 补齐三位
字符串类型
数据类型 | 大小 | 说明 |
---|---|---|
VARCHAR (SIZE) | 0-65,535字节 | 可变长度字符串 |
TEXT | 0-65,535字节 | 长文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
BLOB | 0-65,535字节 | 二进制形式的长文本数据 |
日期类型
数据类型 | 大小 | 说明 |
---|---|---|
DATETIME | 8 字 节 | 范围从1000到9999年,不会进行时区的检索及转换。 |
TIMESTAMP | 4 字 节 | 范围从1970到2038年,自动检索当前时区并进行转换。 |
NULL约束
可以看到上面有些数据在没有插入的情况下都是默认为NULL的,但是在实际的数据库表设计的过程中,有些是不能为空的,例如学生的学号、姓名应该是不能为空的
语法:
create table student
(
id int not null,
name varchar(20) not null
);
设置属性非空了之后,在插入数据的时候就不能使其为NULL了
UNIQUE:唯一约束
例如学生的信息表,理论上每个学生的学号都是独一无二的,不能重复的,那么在表设计的时候就应该对学生的学号进行约束使其不能重复,例如以下的情况:
出现重复的姓名
当我们对某一个属性(某一列)进行约束时:
create table tablename
(
id int unique,--对学号这一列进行约束使其数据不能重复
name varchar(20)
);
可以看到,当插入重复相同的数据时就会出现错误。
DEFAULT:默认值约束
比如当插入一些数据为空或者没有插入数据的时候,我们可以给一个默认值,例如当学生姓名没有输入的时候,可以给一个默认值 unknown 例如:
create table student
(
id int not null,
name varchar(20) default 'unknown'
);
PRIMARY KEY:主键约束
所谓主键就是一条信息数据的唯一约束,比如一个学生的信息中学号、姓名、年级、性别等学号就是主键,是一个学生的唯一标识,因为学号是唯一存在的,而姓名、年级、性别等都是会重复的,不能唯一确定该学生的。因此我们在创建表的时候会给一条数据中的某一项进行主键约束,例如:
create table tablename
(
id int primary key,
name varchar(20),
------
);
通过查看创建表时的信息我们可以发现 我们将 id设置为主键,主键的属性是非空的,而且是主键,下来我们再通过表数据的插入来进行实验:
例如:
insert into test1 values(1001,'黄权');
insert into test1 values(1001,'桥应');
可以看到,当设置为主键之后,该属性就不能插入相同的值。这里大家会发现这里的主键和上面的UNIQUE:唯一约束 有一点异曲同工之妙,但是两者不同的是 主键是唯一且非空的,也就是说UNIQUE+NOT NULL = PRIMARY KEY
当然有了主键还有一个外键
FOREIGN KEY:外键约束
从字面很好理解 foreign 外国、外键
那么外键是干什么的呢?有什么作用呢?为什么要有这样一个外键呢?
举个栗子:
学校的学生信息系统里例如存放学生信息有两个表:
学生信息表、学生课程表
学生信息表:
学生课程表:
学生成绩表:
为了方便查看我们给表里插入一些数据
这里可以看到这是两个完全独立的表,如果一个学生信息表里再添加其他额外的信息如课程信息,选课信息,成绩信息等等,就会使数据表的数据表的杂乱无章,而将学生的其他信息从其独立出来就会比较的数据单一,简单,方便以后的数据使用,但是如何将这两个表的数据关联起来呢?这里就引入了外键,使用外键可以将一个表与另一个表联系起来即:
一个表的外键是另一个表的主键,例如学生信息表包括一个外键class_id 而在课程表中就可以通过课程表的主键class_id来找到所对应的课程信息
外键设置方法:以上面的学号信息表为例
语法:
foreign key (字段名) reference 主表(列)
--创建课程表--
create table student_calss
(
id int primary key comment'课程号',
name varchar(20) not null comment'课程名称'
);
--创建学生信息表--
create table student_info
(
id int primary key comment'学号',
name varchar(20) not null comment'姓名',
tell varchar(11) not null comment'电话',
class_id int not null comment'课程号',
foreign key (class_id) references student_class(id)
--这里用class_id作为外键关联课程表的主键id,这里就将两个表联系起来了--
);
CHECK约束
例如一下代码:
create table test_user
(
id int primary key,
name VARCHAR(20),
sex VARCHAR(1),
check (sex='男'or sex='女')
);
可以看到当我们使用check约束时可以对表中的某个属性进行一定的约束,来保证数据的正确性。