1
数据库原理与应用技术
1.6.2.1 5.2.1 定义、删除与修改基本表
5.2.1 定义、删除与修改基本表

1. 定义基本表

定义基本表是建立数据库最重要的一步。

1)语句格式

CREATE TABLE <表名>

(<列名><数据类型>[ <列级完整性约束条件> ]

[,<列名><数据类型>[ <列级完整性约束条件>] ] …

[,<表级完整性约束条件> ] )

2)语句功能

该语句的功能是在当前或给定的数据库中定义一种表结构,即关系模式。

3)语句说明

<表名>:用于定义基本表的名字。

<列名>:组成该表的各个属性(列)。

<列级完整性约束条件>:涉及相应属性列的完整性约束条件。

<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件。

下面说明语句格式。句首的大写英文单词为语句关键字,由它可以大体了解语句的功能。用尖括号标记的内容是需要用户给定的标识符,标识符是由汉字、数字等组成的一串字符。在语句关键字、用户标识符和字符串常量(用一对单引号引起来的一串字符)中使用英文字母时,默认为大小写等效,即系统不区别它们。每条SQL语句都可以单独作为命令来使用,所以又称为SQL命令。

SQL语句格式中使用中括号、大括号、竖线、省略号等语法标记符的含义,同一般计算机语言中规定的相同。中括号中的语法成分可以选用,也可以省略不用。括号中用一条或若干条竖线分开的每个语法成分,有且只能有一个被选用。省略号表示其前一语法成分可以重复出现若干次。

上述语句格式说明在当前数据库中建立一个表,<表名>是用户给所定义的表取的名字。<列名>可以在一个表定义中出现一次或多次,每个列名即属性名,其后是该列的数据类型和对该列的完整性约束。在最后给出表级完整性约束条件。

(1) 每列后面的完整性约束就是列级完整性约束,它会给出该列数据的完整性约束条件。表中任意行在该列上的值若在改变时破坏了规定的条件,则系统将拒绝这种操作。列级完整性约束有以下6种。

①DEFAULT <常量表达式>,默认值约束。若有该约束,当不给元组中的该列分量输入值时,则采用<常量表达式>所提供的值。

②NULL/NOT NULL,空值/非空值约束。它约束该列值是否允许为空。对于非主属性,若未注明此项,则隐含空值约束,即允许在任何行上的该列值为空。

③PRIMARY KEY,主码约束。注明该列为关系的主码。一种关系只能注明一个主码,也可以不注明主码。在一种关系被注明主码前,其所有元组将按主码值的升序排列。

④UNIQUE,唯一值约束。注明该列上的所有取值必须互不相同。唯一性约束要求表中列的值为非空的值且都是唯一的,只能有一个空值。

⑤REFERENCES <父表名>(<主码>),外码约束。注明该列为外码,并给出对应的父表及父表中被参照的主码。另外,在一些实际的数据库管理系统中,不仅允许主码被参照,而且允许候选码或单值约束的属性被参照。

⑥CHECK<逻辑表达式>,检查约束。注明该列的取值条件。该约束中常常含有列名,如“sex=′男′或sex=′女′”这个性别检查的字段规定性别这个字段只能输入“男”或“女”。如果输入其他值,则会提示错误。

(2) 表级完整性约束条件在所有列定义后给出,包括以下4种。

①PRIMARY KEY(<列名>…),主码约束。注明一列或同时多列为主码。因为有的表的关键字是组合属性,所以主码不止一个。如PRIMARY KEY(学号,课程号)就定义了相应关系中的主码为学号和课程号这两个属性的组合。

②UNIQUE(<列名>…),唯一值约束。注明一列或同时若干列为单值。

③FOREIGN KEY(<列名>…)REFERENCES <父表名>(<主码>…),外码约束。注明一列或同时多列为外码,并给出对应的父表及父表中被参照的主码中的所有列。注意:外码必须与被参照关系中对应的主码或候选码具有完全相同的数据类型。

④CHECK<逻辑表达式>,检查约束。注明每行中一列或若干列在取值上必须满足的条件。如CHECK(出生日期<工作日期>)就定义了出生日期和工作日期这两列之间的检查约束。

上述列级完整性约束和表级完整性约束有些地方是相似的,如 UNIQUE、PRIMARY KEY和CHECK。对于这些约束,若只涉及一列,则既可以作为列级完整性约束,又可以作为表级完整性约束,但只能取其一。若涉及多列,则只能作为表级完整性约束来定义。因此后者的书写与前者的书写也是有区别的。

【例5-1】建立一个学生表student,它由学号sno、姓名sname、性别sex、年龄age、所在系department、籍贯bplace属性组成。其中学号不能为空,值是唯一的,并且姓名取值也是唯一的。

解:

CREATE TABLE student

(sno CHAR(10),

sname CHAR(10) UNIQUE,

sex AR(2) ,

age NUMERIC(3),

department CHAR(8),

bplace CHAR(10),

PRIMARY KEY(sno)

2. 修改基本表

随着应用环境和应用需求的变化,有时需要修改已建立好的基本表。

1)语句格式

ALTER TABLE <表名> [ADD <新列名><数据类型> [完整性约束条件]] [DROP COLUMN<完整性约束名>] [ALTER COLUMN <列名><数据类型>]

2)语句功能

在建立好的表中添加列或完整性约束,或者从已定义过的表中删除列或完整性约束,或者对现有的列进行修改。

3)语句说明

<表名>:用于修改基本表的表名。

ADD子句:用于增加新列和新的完整性约束条件。

DROP子句:用于删除指定的完整性约束条件。

ALTER子句:用于修改列名和数据类型。

注意:向表中增加的一个新列在不带默认值约束的情况下不能规定为空,因为在执行时需要给每行上的该列添加空值;在删除一列之前,必须先删除与该列有关的所有约束,否则系统将拒绝对该列的删除;在表上定义的所有约束都对应有唯一的约束名,该名称可以在定义约束时由用户命名,若用户未命名,则由系统自动命名。通过该语句的删除功能能够删除该约束名所对应的约束。该约束可以是列级约束,也可以是表级约束。

【例5-2】对例5-1建好的学生表student增加一个电话号码stel列(字段)。

解:ALTER TABLE student ADD stel CHAR(12)

【例5-3】删除例5-2增加的电话号码stel这个列(字段)。

解:ALTER TABLE student DROP COLUMN stel

【例5-4】将例5-1建好的学生表student中系department的宽度调整为10。

解:ALTER TABLE student ALTER COLUMN department CHAR(10)

3. 删除基本表

这里用到表完整性约束的主码句子PRIMARY KEY(<列名>)。被定义为主码的列强制满足非空和唯一性条件。凡带有NOT NULL的列,表示不允许出现空值;反之,不带NOT NULL的列,可以出现空值。首次使用CREATE TABLE定义一个新表,只是建立了一个空表。

当不再需要该表时,可以删除基本表。

1)语句格式

DROP TABLE〈表名〉[CASCADE |RESTRICT]

2)语句功能

删除指定的表,包括表结构与表记录。

3)语句说明

当选用任选项CASCADE删除表时,该表中的数据、表结构及在该表上所建的索引和视图将全部随之删除;当选用任选项RESTRICT时,只有在先删除了表中的全部数据,以及该表上所建立的索引和视图后,才能删除一个空表;否则拒绝删除该表。

【例5-5】删除例5-1建立的学生表student,如下:

DROP TABLE student CASCADE

一旦删除该表,表中的数据和此表上所建立的索引和视图都将被自动删除。

同理,后续例题当中用到的学生数据库中的course表可以定义如下:

CREATE TABLE course

(cno CHAR(10),

cname CHAR(20) NOT NULL,

PRIMARY KEY (cno))

对于学生数据库中的enroll表,可定义如下:

CREATE TABLE enroll

(sno CHAR(10),

cno CHAR(10),

grade NUMERIC(3),

PRIMARY KEY (sno,cno))