数据库学习(4)——数据表的创建与更新1
数据库学习(4)——数据表的创建与更新1
数据库学习(3)——数据库的创建与删除
http://www.zzzyk.com/database/201305/207489.html
数据表是关系数据库中操作的级别对象。在关系数据库中,通过数据表来存储数据记录。在数据表中会经常用到主键、外键、约束和索引。这一章将对数据表中涉及到的数据类型以及主键、外键、约束和索引等概念和使用方法做一个全面的介绍。另外还将介绍数据表的创建方法,以及如何对表中的记录进行增加和修改操作、如何删除数据表等内容。
数据库中的表
在关系数据库中,数据表是存储数据的基本单元,由行和列两部分组成的。它是根据数据库设计阶段的E-R图转换而来。在数据表中除了行、列、数据记录、属性、字段等基本概念外,还会涉及到主键、外键、索引、约束等概念。
数据记录、属性、字段、列、行
在关系数据库中,数据表是存储数据的基本单元,由行和列两部分组成的。其中,行用来描述实体中的具体数据,在数据表中每一行中的数据被称为一条数据记录,也可以简称为记录;字段是表中的一列,用来保存数据表中某一条记录中的特定信息。字段在关系数据库中也可以称为列。
主键
为了保证在一张数据表中不会出现两个完全相同的数据记录,需要为每一张数据表都定义一个主键。主键作为数据表中的唯一标示,保证了一条记录的唯一性。通过主键可以区分数据表中的每一条记录。在创建数据表时,需要保证被定义为主键的列的列值唯一,并且不能为空值(即NULL值)。
主键在关系模型中用来约束实体完整性。所谓实体完整性约束是指对数据表中行的完整性约束。在实体完整性中,需要有一个主键来唯一标示数据表中每一行的数据记录,数据表中的主键唯一且不能为空值。
注意:主键可以定义在多个列上,并不一定只定义在一个列上。也就是说,在定义数据表的时候,可以将数据表中的多个列合并在一起作为该表的主键。
外键
外键是用来定义表与表之间的关系的。在数据表中,外键是这样定义的:如果属性列F是关系B中一个属性(并不是关系B的主键),并且属性列F是关系A中的主键,则F就是关系B的外键。关系A中的表被称为主表,关系B中的表被称为主表的从表。
外键在关系模型中用来约束参照完整性。所谓参照完整性约束是指表与表之间的约束。在参照完整性中,从表中的每一条数据记录中的外键值都必须存在于主表中。对于建立了关联关系的两个数据表来说,对其中一个数据表的增加、修改或者删除数据的操作都会对另一个数据表中的记录产生影响。
索引
在实际应用中,为了加快访问速度,节省访问时间,一般都需要使用索引进行查询。例如。在使用电话薄查询电话时,为了减少查询的时间,一般都会使用电话薄中提供的企业名称作为索引来查询;在使用一本书学习某一部分知识的时候,一般都需要翻看书后提供的索引,一般书后的索引都会以字母顺序将相关的主题信息列出,通过这个索引的指引,读者可以很快查找到想要的信息,而不需要为了查询某一个知识点而将书中所有的内容都翻看一遍,节省了查阅的时间,也保证了学习效率。
数据库中的索引与书后提供的索引的功能相同,在数据库的应用中,往往一张数据表中会包含上千条甚至上万条记录,因此为了加快对数据表的访问,通常需要在数据表中建立适当的索引。通过建立索引,在查询数据表中的数据时,数据库可以很快的将其找到,而不用扫描整个数据表。
索引是一个指向数据表中数据的指针,指向索引字段在数据表中的物理位置。如果在执行查询操作时,WHERE子句中指定的字段是被设置为索引的字段,则数据库会首先在索引中对指定的值进行查询,并返回查询的数据在数据表中的位置。如果在执行查询操作时,WHERE子句中指定的字段没有设置为索引的字段,那么数据库会查询数据表中的每一行数据记录,进行全部扫描。因此适当的创建索引,可以加快数据的检索速度,提高对数据的访问效率,提供数据查询的性能。
当然,索引本身也有一些弊端,例如,索引会占用大量的硬盘空间;随着数据列的增加,创建和维护索引的时间也会随之增加;在对数据进行增加、删除和修改等更新操作的时候,需要对索引进行维护,降低更新数据的速度。因此,对那些不是在查询过程中经常用到的列以及在数据表中经常需要进行增加、删除和修改等更新操作的列就不适合建立索引。
虽然创建索引可以提高查询的速度,但是由于索引本身会占用物理空间以及维护索引可能带来的时间的损耗,所以在为数据表中的列创建索引时,并不是为数据表中的每一个列都要创建索引,那样做反而不会起到提高查询效率的作用。因此需要在数据表的适当的列上创建索引。一般可以在下面这些列中创建索引。
1.在主键列中创建索引
2.多表连接时,在经常使用的连接列上创建索引
3.在经常使用WHERE子句查询的列上创建索引
4.在经常进行分组(GROUP BY)和排序(OREDR BY)的列上创建索引
约束
为了保证数据的完整性,需要使用数据库约束。完整性约束包括对表的约束和对列的约束。表约束主要包括唯一约束、主键约束、外键约束和CHECK约束,列约束除了包括唯一约束、参照约束和CHECK约束之外,还有非空约束
唯一约束(UNIQUE):保证使用唯一约束的某一列或者一组列中没有相同的值,即保证列的值的唯一性。但是唯一约束中可以允许在列中插入空值(即NULL值)。
主键约束(PRIMARY KEY):保证使用主键约束的列中只能有唯一的值,并且不能包含空值。数据表中每一列只能定义一个PRIMARY KEY。
外键约束(FOERING KEY):保证表的参照完整性确保对一个表的数据操作不会对与之关联的表造成不利的影响。
检查约束(CHECK):限制列的取值范围或者取值条件。可以为一个列定义多个CHECK约束。
非空约束(NOT NULL):只用来约束列。在向该列插入数据时不允许插入空值。
创建数据表
在创建完数据库之后,就可以在数据库中创建数据表了。创建数据表可以通过使用CREATE TABLE语句。使用CREAT TABLE语句创建数据表的语法格式如下:
CREATE TABLE table_name(
column_name1 datatype1 [constraint_condition1]
[, column_name2 datatype2 [constraint_condition2]]…
)
column_name1为指定数据表的列名;datatype1为指定列名的数据类型;constraint_condition1为指定列名的完整性约束。
为了保证数据的完整性,需要使用数据库约束。约束主要包括唯一约束(UNIQUE)、主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、检查约束(CHECK)和非空约束(NOT NULL)。
唯一约束(UNIQUE)用来保证某一列或者一组列中没有相同的值。如果为列定义了唯一约束,则该列中不允许出现重复的值,但是允许列中存在空值(即NULL值)。唯一约束即可以定义的表级上,也可以定义在列级上。一般在为列创建唯一约束后,数据库会自动为该列建立一个唯一索引,其索引名与约束名是相同的。
主键约束(PRIMARY KEY)是用来保证使用主键约束的某一列或者一组列中有唯一的值,并且不能包含空值(即NULL值)。数据表中每一列只能定义一个PRIMARY KEY。一般在为列创建主键约束后,数据库会自动为该列建立一个主索引,其索引名与约束名是相同的。
在创建数据表时,如果希望将多个列组合起来作为一个数据表中的主键,可以在PRIMARY KEY关键字后使用括号,将需要定义为主键的列放到PRIMARY KEY关键字后面的括号中。括号中的多个列之间需要使用逗号分割。
首先来考虑这样一个问题,现在由于某种原因需要将一名学生在学校的全部信息删除。这里涉及学生信息的一共有两个表,一个是学生信息表,一个是成绩信息表。学生信息表保存的是学生的基本信息,成绩信息表保存的是学生选课的课程成绩信息。如果没有定义外键约束,将该名学生从学生信息表中删除时,而没有将该名学生的选课的课程成绩信息删除,这样就会造成两个关联表之间数据的不一致。
同样的问题也可能出现在对两个关联表中数据的修改操作中。如果是多个表之间存在关联关系的话,不定义外键约束,类似上面的情况很可能会发生。为了避免由于操作不当而引起的关联表中数据的不一致,有必要为关联表之间定义外键约束。
外键约束(FOERING KEY)主要是用来定义两个表之间的关系。外键约束保证了表的参照完整性,确保对一个表的数据操作不会对与之关联的表造成不利的影响。定义外键的语法格式如下:
FOREIGN KEY[表名1](列名1) REFERENCES 表名2(列名2)
[ON UPDATE [CASCADE]|[SET NULL]|[RESTRICT]]
[ON DELETE[CASCADE]|[SET NULL]|[RESTRICT]]
其后的ON UPDATE和ON DELETE分别指明了对表中的数据做修改和删除时,主从表之间要采用的主要操作方式。
CASCADE:级联删除。如果主表中的一条数据记录被删除,那么从表中与之相对应的的数据也将被一起删除。
SET NULL:置空删除。如果主表中的一条数据记录被删除,那么从表中与之相对应的的数据也将被设置为空值。
RESTRICT:受限删除。如果主表中的一条数据记录被删除,则在执行DELETE命令时数据库管理系统会报错,通知用户与主表相对应的该数据在从表中仍然存在,但是与主表相对应的该数据在从表中不会被删除。它是默认的方式