收稿日期:2006-09-10? 作者简介:蒋景行(1945-),男,湖南邵阳人,武汉科技大学中南分校信息工程学院高级工程师。? (武汉科技大学中南分校 信息工程学院,湖北 武汉 430223)?
摘要:关系数据库的建表命令CREATE TABLE常被去掉可选项而使用,这种用法存在功能上的不足。本文从数学上关系的性质出发,说明数据库的建表命令CREATE TABLE必须带上可选项PRIMARY KEY才能建立起来关系,亦即PRIMARY KEY是CREATE TABLE的不可不选的选项。?
关键词:数据库;SQL;建表?
中图分类号:TP311.13文献标识码:A??
CREATE TABLE是关系数据库的建表命令。关系数据库基于集合论中的关系,数学上称为关系、数据库里称为表。所以建表就是建立关系。?
一、关系及其行列性质?
关系是集合的笛卡儿乘积的子集。?
设有学生属性集合:?
姓名={张三,李四,王妩}?
性别={男,女}?
年龄={18,19}?
籍贯={湖南,湖北,江西}?
姓名×性别×年龄×籍贯是它们的一个笛卡儿乘积:?
张三 男 18 湖南?
张三 男 18 湖北?
张三 男 18 江西?
张三 男 19 湖南?
张三 男 19 湖北?
张三 男 19 江西?
张三 女 18 湖南?
张三 女 18 湖北?
张三 女 18 江西?
张三 女 19 湖南?
张三 女 19 湖北?
张三 女 19 江西?
李四 男 18 湖南?
李四 男 18 湖北?
李四 男 18 江西?
李四 男 19 湖南?
李四 男 19 湖北?
李四 男 19 江西?
李四 女 18 湖南?
李四 女 18 湖北?
李四 女 18 江西?
李四 女 19 湖南?
李四 女 19 湖北?
李四 女 19 江西?
王妩 男 18 湖南?
王妩 男 18 湖北?
王妩 男 18 江西?
王妩 男 19 湖南?
王妩 男 19 湖北?
王妩 男 19 江西?
王妩 女 18 湖南?
王妩 女 18 湖北?
王妩 女 18 江西?
王妩 女 19 湖南?
王妩 女 19 湖北?
王妩 女 19 江西?
该乘积包含了这4个属性各元素按照姓名―性别―年龄―籍贯顺序的所有可能的组合。一个组合称为一个元组(属性元素的组合),所有元组构成一个集合。笛卡儿乘积排成单纯的行列,属性也称为列,元组也称为行。?
(一)关系无重复行?
笛卡儿乘积的子集有很多个。一行是子集,多行也是、全部行也是,它们称为关系。例如:?
张三 男 19 江西?
李四 男 18 湖北?
王妩 女 18 湖南?
当然,下面也是一个关系:?
张三 男 19 江西?
李四 男 18 湖北?
王妩 女 18 湖南?
李四 男 18 江西?
这个关系里含有两个名叫李四的学生,都是18岁的男生,但一个是湖北人、一个是江西人。?
极端地说,整个笛卡儿乘积也是一个关系。关系里含有12个名叫张三的学生:一个18岁的男湖南人、一个18岁的男湖北人、一个18岁的男江西人、……,还有一个19岁的女江西人。李四、王妩也一样。?
很明显,笛卡儿乘积无重复行;关系自然也无重复行。无重复行是关系的一个重要性质。?
事物由它的属性表征。关系的第一行表征一个19岁的男性江西学生名叫张三,每一行表征一个学生;行行不同,这就构成一张实用的二维学生表。?
(二)实用二维表都可以用关系来构造?
上面的笛卡儿乘积中只有一个18岁的男湖南张三、而没有第二个。那么,一个含有两个18岁的男湖南张三的关系,怎样去构造呢?增加一个属性集合,例如学号={901,902,903,904},从姓名、性别、年龄、籍贯、学号这5个集合的笛卡儿乘积中选取子集;那里面有4个18岁的男湖南张三、但学号彼此不同,分别是901、902、903、904。?
一般地说,属性集合:?
姓名={姓名|可用作姓名的字符串}?
性别={性别|男/女}?
年龄={年龄|自然数}?
籍贯={籍贯|现用地名字符串}?
可以构造出所有具有这4个属性的任何学生关系。?
于是,关系被作为存储同类事物个体的模型。?
二、CREATE TABLE命令?
关系由集合的元素结构而成,每一行都按照统一的顺序从各个集合里取出一个元素,两行之间至少有一个元素不同。对行的结构的说明,即对构成关系的各集合的名称、类型、顺序、以及集合之间的关系等的说明,称为关系模式,形象地说就是二维表的表头。按照关系模式存入的数据便结构成关系,在表头下填入的数据便结构成关系。?
数据库建立关系分为两步:用CREATE TABLE命令建立关系模式,然后用INSERT命令输入数据。所输入的数据便结构成关系。?
在标准语言SQL99中,CREATE TABLE命令的语法格式如下(各管理系统大同小异):?
CREATE \[{GLOBAL|LOCAL} TEMPORARY\] TABLE <table_name>?
(?
<column_name>{<domain_name>|<datatype>\[<size1>\[,<size2>\]\]}?
\[<column_constraint>,…\]?
\[DEFAULT<default_value>\]?
\[COLLATE<collation_name>\],…?
\[<table_constraints>\]?
\[ON COMMIT{DELETE|PRESERVE}ROWS\]?
)?
命令包括两大功能部分。前面的<column_name>必选项部分,定义关系名与各列的属性,即安排横向列、同时检测列不重名(后输入的属性如果与已输入的属性重名则提示错误)。后面的诸多可选项部分,定义关系的完整性约束;检测行不重复的功能项primary key包含在\[<column_constraint>,…\]、\[<table_constraints>\]里面。两大功能是一个整体。?
从建立关系的角度来说,使用这个命令至少要选取primary key一项如下:?
CREATE TABLE<table_name>?
(<column_name><datatype>\[<size1>\[,<size2>\]\]?
\[{,<column_name><datatype>\[<size1>\[,<size2>\]\]}…\]?
,primary key(<primary key>)?
)?
三、命令的简便形式及其功能之不足?
形式上,CREATE TABLE命令有多个必选项和可选项。可选项可选可不选,于是便有了去掉可选项的简便形式:?
CREATE\[{GLOBAL|LOCAL}TEMPORARY\]TABLE<table_name>?
(?
<column_name>{<domain_name>|?
<datatype>\[<size1>\[,<size2>\]\]}?
)?
这个形式常常被引用来建表,特别是举例的时候,例如一本教科书的叙述:?
?
基本表的创建语句的基本形式为:?
CREATE TABLE table_name?
(Col_name1 Type1 \[NOT NULL/NULL\]?
\[{,Col_name2 Type2 \[NOT NULL/NULL\]}…\]?
)?
例:创建下面的学生表:?
学号 姓 名 性 别 籍贯?
0901 张小强 男 湖南?
0902 李 哲 男 江西?
0903 冯 姗 女 湖南?
CREATE TABLE 学生表?
(学号 CHAR(4),姓名 CHAR(8),性别 CHAR(2),籍贯 CHAR(6))?
?
当然,这个命令能够生成例中的学生表;但是它也能够生成具有重复记录的下面这张表:?
学号 姓 名 性别 籍贯?
0901 张小强 男 湖南?
0902 李 哲 男 江西?
0903 冯 姗 女 湖南?
0902 李 哲 男 江西?
这是学生表加上一条重复记录。显然,这张表不是关系。?
用命令统计这张表的记录条数,结果是4;插入记录完全自由,再插入一条李哲的记录也可以;修改李哲的籍贯,两条李哲记录的籍贯都被修改;删除李哲,两条李哲的记录都被删除。可见,在统计、插入、修改、删除的过程中,RDBMS并不检测所操作的表是关系还是不是关系;就过程本身而言,操作关系得到关系的结果,操作非关系得到非关系的结果。?
要是使用SQL Server界面修改李哲的籍贯和删除李哲的记录,则不允许进行,想改变表中记录重复的现状还做不到。(不使用命令的话,这张表岂不只能作废?)?
能够生成不是关系的表体现了简便形式的功能不足。简便形式能够完善地定义属性列、却不能检测重复的元组行,它缺少定义主键的功能。?
虽然在进一步将学生表作为另一张表(譬如成绩表)的参照对象、而建立两表联系的时候,系统的参照完整性规则会要求它设置主键;而一旦设置主键,学生表就会受到规范。但是,一开始就建立规范的关系才是正确的选择。?
虽然使用简便形式建立模式、在输入记录的时候注意不让它重复,也能建立起关系;但是,记录量一大就难以做到,同时手误也是难以避免的。?
关系数据库的基础是关系,操作对象是关系、操作结果也是关系,所以,使用CREATE TABLE命令建立的应该是关系。这理所当然。特别是训练学生使用CREATE TABLE命令,为养成良好的、科学的习惯,当以建立关系为上。具体到前面的例题,最好使用下面的命令:?
CREATE TABLE 学生表?
(姓 名 char(8),性别 char(2),年龄 int,籍贯 char(4),primary key (姓名))?
参考文献?
[1]陈洛资.数据库系统及应用基础[M].北京:北方交通大学出版社,2002.?
[2]孔璐,吴志坚,顾洪.数据库原理与开发应用技术[M].北京:国防工业出版社,2004.?
[3]关敬敏,沈立强,李莉.SQL Server数据库应用教程[M].北京:清华大学出版社,2005.?
[4][美]Alex Kriegel,Boris M.Trukhno著,陈冰等译.SQL宝典[G].北京:电子工业出版社,2003.?
[5][美]Paul Nielsen著,刘瑞,陈微,闫继忠,刘文等译,SQL Server 2000宝典[G].北京:中国铁道出版社,2004.?
[6][美]Robert Sheldon著,黄开枝,冉晓?等译.SQL实用教程[M].北京:清华大学出版社,2004.?