• 学前教育
  • 小学学习
  • 初中学习
  • 高中学习
  • 语文学习
  • 数学学习
  • 英语学习
  • 作文范文
  • 文科资料
  • 理科资料
  • 文档大全
  • 当前位置: 雅意学习网 > 小学学习 > 正文

    【CREATE TABLE与关系】 中国式关系

    时间:2020-07-14 07:19:42 来源:雅意学习网 本文已影响 雅意学习网手机站

      收稿日期: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.�

    推荐访问:关系 CREATE TABLE CREATE TABLE与关系

    • 文档大全
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章