创建数据库有两种典型的方法:
我们主要介绍第二种,也就是创建数据库的SQL命令的语法格式。
CREATE DATABASE NAME_OF_DATABASE
这就是一条最简单的创建数据库的语句,关键就是在于CREATE DATABASE
,这样的一条创建语句会使得DBMS按照默认的逻辑名称、文件组、初始大小、自动增长以及路径等属性来创建数据库。如果我们想自己定义这些数据,就需要在CREATE后面继续追加限制语句。完整的创建数据库语法格式如下所示:
以一个实际的例子来展示实际的数据库创建语句,如下:
CREATE DATABASE Teach
ON
(NAME=Teach_Data,
FILENAME='E:\TeachData.mdf',
SIZE=10,
MAXSIZE=500,
FILEGROWTH=10)
LOG ON
(NAME=Teach_Log,
FILENAME='E:\TeachData.ldf',
SIZE=5,
MAXSIZE=500,
FILEGROWTH=5)
在创建了数据库之后,还可以对数据库的名称、大小和属性等进行修改。用于修改数据库的命令是:
ALTER DATABASE NAME_OF_DATABASE
......
注意,只有DBA或者具有CREATE DATABASE
权限的人员才有权执行此命令。我们通过几个例子来对修改数据库的SQL命令有一个直观的认识:
ALTER DATABASE Teach
MODIFY FILE
(NAME = Teach_Data,
FILEGROWTH = 20)
ALTER DATABASE Teach
ADD FILE(
NAME=Teach_Datanew,
FILENAME='E:\Teach_Datanew.ndf',
SIZE=100,
MAXSIZE=200,
FILEGROWTH=10)
ALTER DATABASE Teach
REMOVE FILE Teach_Datanew
DROP DATABASE NAME_OF_DATABASE
建立好了数据库之后,我们就进入到创建数据表的过程中了,也就是我们平时所能见到的,类似下面这样的数据表:
数据表中的每一列(也就是每一个字段Field)都是来自于同一个域的,是必须要属于同一种数据类型的,所以我们在创建数据表的时候,需要为表中的每一个属性设置合适的数据类型。举例说年龄就只能是正整数,而姓名就是字符串类型的属性,一些常见的数据类型如下表所示:
数据表是由行和列的过程,行就是一个个的元组,也就是我们所要保存的数据。而我们创建数据库的过程,就是定义数据表列的过程,也是定义数据表结构的过程,我们重点着眼于使用SQL命令来创建数据表。首先我们通过例子来给出一个实际的建表SQL命令:
CREATE TABLE S
( SNo CHAR(6),
SN VARCHAR(10),
Sex NCHAR(1) DEFAULT '男',
Age INT,
Dept NVARCHAR(20))
完整的创建数据表的语法格式为:
当中出现了一个概念:约束。这是SQL Server提供的一种数据完整性机制,数据的完整性是指保护数据库中数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作。SQL Server提供的完整性机制除了约束Constraint以外,还包括:
约束是SQL Server自动强制数据库完整性的方式,约束定义了列中允许的取值。SQL Server中的约束分为列约束和表约束,其中列约束是对某一个特定列的约束,包含在列的定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;表约束与列约束相互独立,不包括在列定义之中,通常对于多个列一起进行约束,与列定义用逗号分隔,并且必须要指定被约束列的名称。完整性约束的基本语法格式为:
CONSTRAINT NAME_OF_CONSTRAINT TYPE_OF_CONSTRAINT
如果我们没有给一个约束指定名称,也就是在上面这条语句中略去NAME_OF_CONSTRAINT
,系统会为这个约束给定一个名称;并且我们在定义一个约束时,必须要指定该约束的类型TYPE_OF_CONSTRAINT
,在SQL Server中,可以定义5种类型的完整性约束:
NULL是表示"未知"、"不确定"或者"没有数据"的意思,当某一个字段一定要输入了值才有意义时,可以为该字段设置一个NOT NULL
约束。例如我们前面曾经说过的主体完整性约束规定了主码列中不允许出现空值,否则就失去了唯一标识一条记录的作用,下面是一个实际的NULL/NOT NULL
约束的例子:
【例】 建立一个S表,对SNo
字段进行NOT NULL
约束。
CREATE TABLE S
( SNo VARCHAR(6) CONSTRAINT S_CONS NOT NULL,
//NAME_OF_CONSTRAINT can be ignored.
//SNo VARCHAR(6) CONSTRAINT NOT NULL
SN NVARCHAR(10),
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20))
UNIQUE
约束用于指明基本表在某一列或者多个列的组合上的取值必须唯一。定义了UNIQUE
约束的那些列称为唯一键,系统会自动为唯一列建立唯一索引,从而保证了唯一键的唯一性。唯一键是允许为空的,但由于需要保证其唯一性,所以最多只有一个NULL值。一个数据表中可以有多个UNIQUE
约束,UNIQUE
约束也可以作用在多个字段上。用于列约束时,其语法格式如下:
CONSTRAINT NAME_OF_CONSTRAINT UNIQUE
用于表约束时,其语法格式如下:
CONSTRAINT NAME_OF_CONSTRAINT UNIQUE(Col_1,Col_2,...,Col_n)
//Col_i stands for the name of column.
下面给出几个例子来体会UNIQUE
约束:
【例】建立一个S表,定义SN
为唯一键。
CREATE TABLE S
( SNo VARCHAR(6),
SN NVARCHAR(10) CONSTRAINT SN_UNIQ UNIQUE,
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20))
【例】建立一个S表,定义SN+Sex为唯一键,此约束为
表约束。
CREATE TABLE S
( SNo VARCHAR(6),
SN NVARCHAR(10) UNIQUE,
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20),
CONSTRAINT S_UNIQ UNIQUE(SN, Sex))
PRIMARY KEY
约束用于定义基本表的主码,前面我们在关系中介绍过主码,也说过数据库要求的主体完整性,所以主码既不能重复,也不能为NULL,籍此来保证完整性。PRIMARY KEY
约束就像是NOT NULL
约束和UNIQUE
约束的结合体,但我们需要明确以下几点:
PRIMARY KEY
约束只能存在一个,但UNIQUE
约束可以存在多个;UNIQUE
约束,又定义了PRIMARY KEY
约束。PRIMARY KEY
约束用于列约束时,说明该数据表的主码只有单独的这一个列,用于表约束时,就是将某几个列的组合定义为主码。下面给出几个例子来对PRIMARY KEY
约束有一个直观的体会:
【例】建立一个S表,定义SNo为S的主键,建立另外一个数据表C,
定义CNo为C的主键。
//Table-S
CREATE TABLE S
( SNo VARCHAR(6) CONSTRAINT S_Prim PRIMARY KEY,
SN NVARCHAR(10) UNIQUE,
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20))
//Table-C
CREATE TABLE C
( CNo VARCHAR(6) CONSTRAINT C_Prim PRIMARY KEY,
CN NVARCHAR(20),
CT INT)
【例】建立一个SC表,定义SNo+CNo为SC的主键。
CREATE TABLE SC
( SNo VARCHAR(6) NOT NULL,
CNo VARCHAR(6) NOT NULL,
Score NUMERIC(4,1),
CONSTRAINT SC_Prim PRIMARY KEY(SNo,CNo))
注意上述代码中SNo
和CNo
列中的NOT NULL
约束可以略去,但绝对不可以加上NULL
约束,会和后续的PRIMARY KEY
约束产生冲突。
FOREIGN KEY
约束用于指定某些列的组合(包括单独的一列)作为外码,其中包含外码的表称为从表,包含外码所引用的主码或唯一键的表称为主表,系统会保证从表中外码的取值是主表中主码的某一个值(或是唯一键值),或者可以取为NULL值,以满足数据库要求的参照完整性。
和PRIMARY KEY
类似地,FOREIGN KEY
既可以用于列约束,也可以用于表约束,其语法格式为:
CONSTRAINT NAME_OF_CONSTRAINT FOREIGN KEY REFERENCES
NAME_OF_PRIMARY_TABLE(Col_1,Col_2,...,Col_n)
下面给出一个例子来对FOREIGN KEY
约束有一个直观的认识:
【例】建立一个SC表,定义SNo,CNo为SC的外部键。
CREATE TABLE SC
( SNo VARCHAR(6) NOT NULL CONSTRAINT S_Fore
FOREIGN KEY REFERENCES S(SNo),
CNo VARCHAR(6) NOT NULL CONSTRAINT C_Fore
FOREIGN KEY REFERENCES C(CNo),
Score NUMERIC(4,1),
CONSTRAINT S_C_Prim PRIMARY KEY (SNo,CNo))
注意到在表SC
(学生选课表)中,SNo+CNo
是其主码,也就是说同时知道学生学号和课程号才能确定下一条记录,而SNo
和CNo
单独的每一个都不是主码。另外,SNo
作为学生关系S
的主码,CNo
作为课程关系C
的主码,都可以被SC
关系参照,来作为SC
关系的外码被定义。
CHECK
约束用于检查字段值所允许的范围,例如字段年龄只能输入正整数,而且是限制在0~150之间的整数。在定义CHECK
约束时,需要考虑以下几个因素:
CHECK
约束;CHECK
约束;CHECK
约束必须是表约束;INSERT
、UPDATE
等修改数据表的操作时,CHECK
约束会验证新的数据。CHECK
约束的语法格式如下所示:
CONSTRAINT NAME_OF_CONSTRAINT CHECK(CONDITION)
下面给出几个例子来对CHECK
约束以及SQL Serer支持的各种约束进行展示:
【例】建立一个SC表,定义Score的取值范围为0~100之间。
CREATE TABLE SC
( SNo VARCHAR(6),
CNo VARCHAR(6),
Score NUMERIC(4,1) CONSTRAINT Score_Check
CHECK(Score>=0 AND Score <=100))
【例】建立包含完整性定义的学生表S。
CREATE TABLE S
(
SNo VARCHAR(6) CONSTRAINT S_Prim PRIMARY KEY,
SN NVARCHAR(10) CONSTRAINT SN_Cons NOT NULL,
Sex NCHAR(1) CONSTRAINT Sex_Cons NOT NULL DEFAULT '男',
Age INT CONSTRAINT Age_Cons NOT NULL
CONSTRAINT Age_Check CHECK(Age BETWEEN 12 AND 50),
Dept NVARCHAR(20) CONSTRAINT Dept_Cons NOT NULL
)
由于应用环境和应用需求的修改,可能要修改表的基本结构,例如增加新的字段列、完整性约束,或者修改原有的字段列的定义、完整性约束的定义等。SQL使用下述的命令来完成修改数据表的功能:
ALTER DATABASE
ADD
修改方式用于添加新的字段列或完整性约束,我们先给出几个例子,再描述其完整的语法格式:
【例】在S表中增加一个班号列Class_NO
和住址列Address
。
ALTER TABLE S
ADD
Class_No VARCHAR(6),
Address NVARCHAR(20)
注意!使用此方式增加的新列自动填充NULL值,所以不能为增加的新列指定NOT NULL约束。但可以在后续的操作中,完善新列的完整性定义。
【例】在SC表中增加完整性约束定义,使Score在0~100之间。
ALTER TABLE SC
ADD
CONSTRAINT Score_Chk CHECK(Score BETWEEN 0 AND 100)
ADD
方式的完整语法格式如下,对照上面的例子进行体会:
ALTER TABLE NAME_OF_TABLE ADD
DEFINITION_OF_COLUMN|DEFINITION_OF_CONSTRAINT
ALTER
方式用于修改某些列,使用该方式有着下面的一些限制:
类似地,我们先给出例子,再描述其完整的语法格式:
【例】把S表中的SN列加宽到12个字符。
ALTER TABLE S
ALTER COLUMN SN NVARCHAR(12)
ALTER
方式的完整语法格式如下所示,可以对照上面的例子体会用法:
//COLUMN
ALTER TABLE NAME_OF_TABLE
ALTER COLUMN NAME_OF_COLUMN TYPE_OF_DATA NULL|NOT NULL
上面的ALTER
方式中我们说了:只能修改NULL/NOT NULL约束,其他类型的约束在修改之前必须先将约束删除,然后再重新添加修改过的约束定义。
而DROP
方式就是用于删除某些完整性定义的,其语法格式很简洁:
ALTER TABLE NAME_OF_TABLE
DROP CONSTRAINT NAME_OF_CONSTRAINT
【例】 删除S表中的主键。
ALTER TABLE S
DROP CONSTRAINT S_Prim
当某一个基本表不再使用时,可以将其删除。删除之后该表的数据以及建立在这之上的索引都会被删除。但视图的定义会继续保留,只是无法使用,如果后续恢复了该表,这些视图可以重新使用。删除数据表的语法很简单:
DROP TABLE NAME_OF_TABLE
但我们需要注意,只能删除自己建立的数据表,不能删除其他用户所建立的数据表。