数据定义:指对数据库对象的定义、删除和修改操作。
数据库对象主要包括数据表、视图、索引等。
数据定义功能通过CREATE、ALTER、DROP语句来完成。
按照操作对象分类来介绍数据定义的SQL语法。
5.3.1 数据表的创建和删除
数据表是关系模式在关系数据库中的实例化,是数据库中唯一用于存储数据的数据库对象,它是整个数据库系统的基础。创建数据表是数据库建立的重要组成部分,由SQL语言中的CREATE TABLE语句来完成,其语法格式如下:
CREATE TABLE [schema_name.]table_name(
column1_name data_type [integrality_condition_on_column]
[,column2_namedata_type [integrality_condition_on_column]]
…
[, integrality_condition_on_TABLE]);
所涉及参数说明如下:
tanble_name为所定义的数据表的名称,即表名。在一个数据库中表名必须唯一,而且表名应该能够概括该数据表保存数据所蕴涵的主题。
schema_name为表所属的架构的名称。自SQL Server 2008开始,每数据库对象都属于某一个架构,如果在定义时不指定架构,则使用默认架构dbo。关于架构的作用和意义将在第12章中介绍。
column1_name、column2_name表示字段名,或者称字段名。在一个表中,字段名也必须唯一,最好能够概括该字段的含义。
data_type表示数据类型。根据需要,它可以设置为上节介绍的数据类型中某一种。
integrality_condition_on_column表示字段级的完整性约束条件。这些约束条件只对相应的字段起作用,其取值如下:
NOT NULL:选取该条件时,字段值不能为空。
DEFAULT:设定字段的默认值,设置格式为:DEFAULT constant,其中constant表示常量。
UNIQUE:选取该条件时,字段值不能重复。
CHECK:用于设置字段的取值范围,格式为:CHECK(expression),其中expression为约束表达式。
PRIMARY KEY:选取该条件时,相应字段被设置为主码(主键)。
FOREIGN KEY:选取该条件时,相应字段被设置为外码(外键)。外码的设置涉及到两个表,其格式如下:
FOREIGN KEY column_name REFERENCES
foreign_table_name(foreign_column_name)
integrality_condition_on_TABLE表示表级的完整性约束条件。
与integrality_condition_on_column不同的是,integrality_condition_on_column仅仅作用于其对应的字段,而不能设置为同时作用于多个字段;integrality_condition_on_TABLE则可以作用多个字段或整个数据表。
上述的约束条件中,除了NOT NULL和DEFAULT以外,其他的约束条件都可以在integrality_condition_on_TABLE中定义,使它们同时作用多个字段。凡是涉及到多个字段的约束条件都必须在integrality_condition_on_TABLE中定义。
注意: 由两个字段组成的主码必须利用PRIMARY KEY在
integrality_condition_on_TABLE中定义。
SQL语言对大小写不敏感。
【例5.1】 表5.8给出了学生信息表(student)的基本结构。表中列出了所有的字段名及其数据类型和约束条件。
根据上述介绍的内容,我们不难构造出下列的CREATE TABLE语句,用于创建本例设定的学生信息表student:
CREATE TABLE student(
s_no char(8) PRIMARY KEY,
s_name char(8) NOT NULL,
s_sex char(2) CHECK(s_sex = '男' OR s_sex = '女'),
s_birthday smalldatetimeCHECK(s_birthday>='1970-1-1' AND
s_birthday<='2000-1-1'),
s_speciality varchar(50) DEFAULT '计算机软件与理论',
s_avgrade numeric(3,1) CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept varchar(50) DEFAULT '计算机科学系'
);
本书涉及的SQL代码都是在SQL Server Management Studio(简称SSMS)中的SQL代码编辑器中执行。
【例子】 图5.1是执行上述CREATE TABLE语句来创建表student时的界面。
在以上的CREATE TABLE语句中,约束条件都是在字段级的完整性约束定义上实现的。实际上也可以在表级的完整性约束定义上实现上述的部分或全部约束条件。
下列的CREATE TABLE语句等价于上述语句:
CREATE TABLE student(
s_no char(8) ,
s_name char(8) NOT NULL,
s_sex char(2) ,
s_birthday smalldatetime,
s_speciality varchar(50) DEFAULT '计算机软件与理论',
s_avgrade numeric(3,1) CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept varchar(50) DEFAULT '计算机科学系',
PRIMARY KEY(s_no),
CHECK(s_birthday>='1970-1-1' AND s_birthday<='2000-1-1'),
CHECK(s_sex ='男' OR s_sex ='女')
);
当涉及到多字段的约束条件时,则必须使用表级的完整性约束定义来实现。
如果需要将字段s_name和字段s_birthday设置为主键,则必须通过表级的完整性约束定义来实现,相应的语句如下:
CREATE TABLE student(
s_no char(8) ,
s_name char(8) NOT NULL,
s_sex char(2) CHECK(s_sex = '男' OR s_sex = '女'),
s_birthday smalldatetimeCHECK(s_birthday>='1970-1-1' AND s_birthday<='2000-1-1'),
s_speciality varchar(50) DEFAULT '计算机软件与理论',
s_avgrade numeric(3,1) CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept varchar(50) DEFAULT '计算机科学系',
PRIMARY KEY(s_name, s_birthday)
);
【例5.2】 表5.9给出了导师信息表(supervisor)的基本结构,其中c_hour表示导师的工作量,其取值由其指导的学生数量s_n确定:每指导一位学生计15个课时。
根据上述要求,用AS将c_hour定义为计算列,结果CREATE TABLE语句代码如下:
CREATE TABLE supervisor(
t_noint PRIMARY KEY,
t_namevarchar(8) NOT NULL,
s_nint NOT NULL CHECK(s_n>=0 and s_n<=20),
c_hour AS s_n*15
);
当数据表已经确认不需要时,可将其删除。删除格式如下:
DROP TABLE table1_name [,table2_name,…];
【例子】 删除以上创建的表student,可用下列的SQL语句:
DROP TABLE student;
当一个数据表被删除时,其中的数据也将全部被删除。在使用删除语句的时候要特别慎重。
5.3.2 数据表的修改
数据表的修改是指对数据表结构的修改,包括修改字段名和完整性约束条件、增加和删除字段等。这些操作主要由ALTER TABLE语句来完成。
(1)增加字段
在数据表中增加新字段的语法格式为:
ALTER TABLE table_name
ADD new_column data_type [integrality_condition]
【例5.3】 在表student中增加一个新字段——nationality(民族),其长度为20个字符。
可由下列语句完成:
ALTER TABLE student
Add nationality varchar(20);
如果要使得新增加的字段为非空,则可在上述语句后添加“NOT NULL”来完成:
ALTER TABLE student
Add nationality varchar(20) NOT NULL;
但在执行上述语句时,表student必须为空。
(2)删除字段
删除某一个字段的语法格式如下:
ALTER TABLE table_name
DROP COLUMN column_name
【例5.4】 删除表student中的字段nationality。
可以用下列语句完成:
ALTER TABLE student
DROP COLUMN nationality
(3)修改字段的数据类型
在数据表中,修改一个字段的数据类型的语法格式如下:
ALTER TABLE table_name
ALTER COLUMN column_name new_data_type
column_name为待修改的字段,new_data_type为新的数据类型。
【例5.5】 将表student中的字段s_dept的长度由原来的50改为80。
该要求可下列语句实现:
ALTER TABLE student
ALTER COLUMN s_dept varchar(80);
将字段s_no由原来的字符型改为整型,则可用下列的语句:
ALTER TABLE student
ALTER COLUMN s_no int;