2.4 寻求最佳的数据库存储方案——数据存储
15 Mar 2019在MySQL中创建表空间时,我们还可以对表字段进行约束设置,不同的约束条件所要求的数据存储也有所不同。当用户创建好表空间后,我们需要将数据值插入到表空间使其成为完整的数据表。本节将详细介绍数据表约束和数据表管理,其中包括:约束设置、数据表关联、添加表数据、修改表数据、删除表数据。
2.4.1 数据表约束
问题A:什么是SQL约束?
回答A:约束是在数据表中定义的用于维护数据库完整性的条件规则,通过对数据表中的字段定义约束条件不仅可以防止将错误数据插入数据表,还可以保持表之间数据的一致性。
问题B:SQL中的约束有哪些?
回答B:SQL中的约束一般分为列级约束和表级约束,
列级约束共6种类型,包括:主键、外键、唯一、检查、默认和非空;
表级约束共4种类型,包括:主键、外键、唯一、检查。
约束名称 | 约束类型 | 是否支持列级 | 是否支持表级 |
---|---|---|---|
primary key | 主键约束 | √ | √ |
foreign key | 外键约束 | √ | √ |
unique | 唯一约束 | √ | √ |
check | 检查约束 | √ | √ |
not null | 非空约束 | √ | × |
default | 默认约束 | √ | × |
问题C:SQL中列级约束和表级约束的区别?
回答C:
(1)列级约束只作用于一个字段,表级约束能够同时作用于多个字段;
(2)列级约束设置时用空格分隔、不必指定要约束的字段名,
表级约束设置时用逗号分隔、必须指定要约束的字段名;
问题D:SQL中设置列级约束和表级约束的语法格式?
回答D: 数据表约束设置一般在创建表空间时,因此可以将MySQL中创建数据表的基本SQL语法格式修改为:
create table table_name(
column_name1 column_type key_type, #列级约束
column_name2 column_type key_type, #列级约束
···
constraint key_name key_type(column_name1,column_name2) #表级约束
);
表级约束也可以不定义约束名称,即去掉constarint key_name,直接写成key_type(column_name)的语法格式。
【例】在test01数据库中,创建一张名为stu_inf1的学员信息表,要求主键约束用表级约束方法设置,其它约束用列级约束方法设置,表结构如图所示:
字段名称 | 数据类型 | 约束 | 备注 |
---|---|---|---|
Id | int(10) | 主键约束 | 学员编号 |
stu_name | varchar(20) | 唯一约束 | 学员姓名 |
stu_sex | varchar(20) | 非空约束 | 学员性别 |
stu_score | float(10) | / | 学员成绩 |
输入语句如下:
问题E:SQL中设置不同类型约束的作用及语法格式是什么?
回答E:SQL中约束类型共6大类:主键、外键、唯一、检查、非空、默认,设置主键与外键约束的主要作用是保证表与表之间数据的完整性和一致性,设置其它约束的主要作用是防止将错误数据插入数据表。
下面介绍主键约束和外键约束,具体作用及语法格式如下:
(1)主键约束
主键(Primary key)是最常见的约束类型,通常结合外键约束来定义不同数据表之间的关联关系。主键要求被约束的字段数据唯一且不包含空值,一般分为单字段主键和多字段联合主键两种类型。
① 单字段主键约束
单字段主键由一个字段组成,支持列级或表级约束设置方法,MySQL中设置单字段主键的基本SQL语法格式为:
# 列级约束方法设置主键
create table table_name(
column_name column_type primary key
);
# 表级约束方法设置主键
create table table_name(
column_name column_type,
constraint key_name primary key(column_name)
);
【例】创建一张名为stu_inf2的学员信息表,其主键为id列,输入语句如下:
# 列级约束方法设置主键
create table stu_inf2(
id int(10) primary key,
stu_name varchar(20),
stu_sex varchar(20),
stu_score float(10)
);
# 表级约束方法设置主键
create table stu_inf2(
id int(10),
stu_name varchar(20),
stu_sex varchar(20),
stu_score float(10),
constraint pk_1 primary key(id)
);
② 多字段主键约束
多字段主键由多个字段联合组成,仅支持表级约束设置方法,MySQL中设置多字段主键的基本SQL语法格式为:
create table table_name(
column_name1 column_type,
column_name2 cloumn_type,
primary key(column_name1,column_name2)
);
MySQL中设置多字段主键约束时,不需要使用contraint语法定义约束名称。
主键约束注意事项:
(1)每张数据表只能设置一个主键约束,但数据库中很少有不设置主键的数据表;
(2)多字段主键约束是数据表中多个字段联合作为一个主键约束,并不是数据表中多个字段分别作
【例】创建一张名为emp_inf的员工表,表结构如下图所示,表中没有主键id,为了确定唯一一个员工,将name、dept_id联合起来做主键
字段名称 | 数据类型 | 备注 |
---|---|---|
Name | varchar(20) | 员工姓名 |
dept_id | int(10) | 部门编号 |
Exp | float(10) | 工作年限 |
Salary | float(10) | 员工薪资 |
输入语句如下:
(2)外键约束
外键(Foreign key)主要用来建立表与表之间的关联关系,一个表中的外键通常会指向另一个表中的主键。那么对于两个具有关联关系的数据表而言,主键所在的那张表被称为主表/父表,外键所在的那张表被称为从表/子表。外键约束建立好后,不允许删除父表中具有关联关系的行,并且若不先删除子表,父表也不允许被删除,由此保证数据引用的完整性和一致性。MySQL中设置外键约束的基本SQL语法格式为:
create table table_name(
column_name column_type,
constraint key_name foreign key(column_name) references master_table_name(master_column_name)
);
【例】创建一张名为stu_inf3的学员信息表,其主键为id列,输入语句如下:
create table stu_inf3(
id int(10) primary key,
stu_name varchar(20),
stu_sex varchar(20),
stu_score float(10)
);
【例】再创建一张名为teacher的教师信息表,表结构如图所示:
字段名称 | 数据类型 | 备注 |
---|---|---|
id | int(10) | 教师编号 |
s_id | int(10) | 学员编号 |
c_name | varchar(20) | 课程名称 |
t_name | varchar(20) | 教师姓名 |
将名为s_id的字段作为外键关联到stu_inf3的主键id,输入语句如下:
E-R图
E-R图也称实体关联图(Entity Relationship Diagram),它提供了展示实体、属性和关系的方法,是用来描述现实世界的概念模型。E-R图由四个部分绘制而成:
(1)矩形框:表示实体,在框中记录实体名;
(2)椭圆形框:表示属性,在框中记录属性名;
(3)菱形框:表示关系,在框中记录关系名;
(4)连线:将各框之间连接起来,并标注连接类型(1:1、1:n、n:m);
在MySQL中,E-R图可以用来描述表与表之间的关联关系,以上述stu_inf3和teacher表为例,E-R图为:
2.4.2 数据表管理
数据存储是数据库存在的核心价值,MySQL中提供了功能丰富的数据操作语句,用户可以使用INSERT语句往表空间中插入数据,也可以使用UPDATE语句更新数据或者使用DELETE语句删除数据。
(1)插入数据
在查询数据表之前,数据表中必须要有数据,MySQL中插入数据的基本SQL语法格式为:
insert into table_name(column_name1,column_name2```) values(value1,value2```);
【例】往表名为stu_inf1的学员信息表中添加数据,表数据如图所示:
id | stu_name | stu_sex | stu_score |
---|---|---|---|
1 | 张三 | 男 | 83.5 |
2 | 李四 | 男 | 80 |
3 | 王五 | 女 | 90.5 |
4 | 熊六 | 男 | 77.5 |
方法一:逐行插入数据
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(1,"张三","男",83.5);
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(2,"李四","男",80);
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(3,"王五","女",90.5);
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(4,"熊六","男",77.5);
方法二:同时插入多行数据
insert into stu_inf1(id,stu_name,stu_sex,stu_score)
values(1,"张三","男",83.5),
(2,"李四","男",80),
(3,"王五","女",90.5),
(4,"熊六","男",77.5);
插入数据时要保证每列插入的数据值与字段的数据类型相一致,如果数据类型不一致MySQL会报错且无法插入数据。
小贴士:为数据表中所有字段都插入数据时,可以不需要指定字段名,基本SQL语法格式为:
insert into table_name values(value1,value2```);
【例】往表名为stu_inf1的学员信息表中添加数据,输入语句如下:
# 逐行插入数据
insert into stu_inf1 values(1,"张三","男",83.5);
insert into stu_inf1 values(2,"李四","男",80);
insert into stu_inf1 values(3,"王五","女",90.5);
insert into stu_inf1 values(4,"熊六","男",77.5);
# 同时插入多行数据
insert into stu_inf1 values(1,"张三","男",83.5),
(2,"李四","男",80),
(3,"王五","女",90.5),
(4,"熊六","男",77.5);
(2)更新数据
当表中有数据之后,可以对数据进行更新操作,MySQL中更新数据的基本SQL语法格式为:
update table_name set column_name=new_value where column_name=value;
【例】将stu_inf1学员信息表中,学员姓名为张三的成绩修改为85分,输入语句如下:
论数据类型的重要性:
在MySQL中定位数据时,一定要注意数据所在字段的数据类型,若遇到字符型数据必须在数据前后加上单引号或双引号。不同数据类型的使用方法,将在3.4高级查询中详细展开。
(3)删除数据
当数据不在使用时,用户也可以对数据进行删除操作,MySQL中删除数据的基本SQL语法格式为:
delete from table_name where column_name=value;
【例】删除stu_inf1学员信息表中,学员姓名为张三的信息,输入语句如下:
注意:删除数据时,删除的是用户指定数据值所在数据表的某一行,而不是数据值所在的单元格。
练习
(1)在test_stu数据库中,分别创建student学生信息表、score学生成绩表和teacher教师信息表,表结构和约束设置如下:
字段名称 | 数据类型 | 约束 | 备注 |
---|---|---|---|
id | int(10) | 主键约束 | 学员编号 |
s_name | varchar(20) | / | 学员姓名 |
s_age | int(10) | / | 学员年龄 |
s_sex | varchar(20) | / | 学员性别 |
字段名称 | 数据类型 | 约束 | 备注 |
---|---|---|---|
s_id | int(10) | 外键约束 | 学员编号 |
c_name | varchar(20) | / | 课程名称 |
c_score | float(10) | / | 课程成绩 |
字段名称 | 数据类型 | 约束 | 备注 |
---|---|---|---|
id | int(10) | 主键约束 | 教师编号 |
s_id | int(10) | 外键约束 | 学员编号 |
c_name | varchar(20) | / | 课程名称 |
t_name | varchar(20) | / | 教师姓名 |
(2)绘制student学生信息表、score学生成绩表和teacher教师信息表的E-R图:
(3)分别往student学生信息表、score学生成绩表和teacher教师信息表中插入数据,表数据如下:
id | s_name | s_age | s_sex |
---|---|---|---|
101 | 张三 | 17 | 男 |
102 | 李四 | 18 | 男 |
103 | 王五 | 17 | 女 |
104 | 熊六 | 18 | 男 |
s_id | c_name | c_score |
---|---|---|
101 | 语文 | 95 |
101 | 数学 | 75 |
101 | 英语 | 73.5 |
102 | 语文 | 89 |
102 | 数学 | 85 |
102 | 英语 | 86 |
103 | 语文 | 65 |
103 | 数学 | 93.5 |
103 | 英语 | 90.5 |
104 | 语文 | 89 |
104 | 数学 | 92.5 |
104 | 英语 | 94 |
id | s_id | c_name | t_name |
---|---|---|---|
1 | 101 | 语文 | 张玲 |
2 | 102 | 语文 | 张玲 |
3 | 103 | 语文 | 张玲 |
4 | 104 | 语文 | 张玲 |
5 | 101 | 数学 | 杨猛 |
6 | 102 | 数学 | 杨猛 |
7 | 103 | 数学 | 杨猛 |
8 | 104 | 数学 | 杨猛 |
9 | 101 | 英语 | 王爽 |
10 | 102 | 英语 | 王爽 |
11 | 103 | 英语 | 王爽 |
12 | 104 | 英语 | 王爽 |
练习答案
(1)分别创建student学生信息表、score学生成绩表和teacher教师信息表,输入语句如下 :
(2)绘制student学生信息表、score学生成绩表和teacher教师信息表的E-R图,如下图所示:
(3)往student学生信息表、score学生成绩表和teacher教师信息表中插入数据,输入代码如下:
分类: 数据库技术