学习用SQL语句创建表的过程中遇到的一个例子,学生数据库中包含了三个表,创建表的同时为表中的列加上相应的约束,具体如下:
学生数据库的创建
USE master
GO
--创建数据文件
CREATE DATABASE SStudent
ON
(
NAME = SStudent_data,
FILENAME = 'D:\SQL\Student\SStudent_data.mdf',
SIZE = 5MB,
MAXSIZE = 10MB,
FILEGROWTH = 5%
)
--创建日志文件
LOG ON
(
NAME = SStudent_log,
FILENAME = 'D:\SQL\Student\SStudent_log.ldf',
SIZE = 2MB,
MAXSIZE = 10MB,
FILEGROWTH = 1MB
)
GO
表的创建
在这个数据库中新建三个表格,分别是Student(学生信息表)、Course(课程表)、SC(选课表)三个表。其中:
Sudent表中有学号(Sno)、姓名(SName)、性别(Ssex)、年龄(Sage)、所在系(Sdept)等属性列。
Course表中有课程号(Cno)、课程名(Cname)、先行课(Cpno)、学分(Ccredit)等属性列。
SC表中有学号(Sno)、课程号(Cno)、成绩(Grade)等属性列。
显然可以看出这三个表之间存在联系,比如SC表中的Sno、Cno这两列分别与Student表和Course表中的这两列是一样的,那么它们之间一定存在着引用和被引用的关系。
这里Student表中的Sno、Course表中的Cno分别为这两个表的主键,那么SC表中的Sno、Cno则为外键,它们之间的数据库关系图应该是这样的:
此外,为了保证表中的数据完整性,我们还应为这三个表中的其他列设置相应的约束,
比如:
学生信息表中的学号必须为一个固定的位数(这里为设为9位),学生的年龄限制在18至30岁;
为课程表中的先行课有一个默认值;
选课表中的分数范围在0至100分;
下面是创建这三个表的代码:
USE SStudent
GO
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'Student')
DROP TABLE Student
--判断学生表是否存在,如果存在先删除它再创建
CREATE TABLE Student
(
Sno nchar(9) NOT NULL
CONSTRAINT Sno_Len CHECK(LEN(Sno)=9)
CONSTRAINT PK_SNo PRIMARY KEY CLUSTERED,
SName nvarchar(20) NOT NULL
CONSTRAINT UN_SName UNIQUE NONCLUSTERED, --姓名不允许有重复值
Sage int NOT NULL
CHECK(Sage > 18 and Sage < 30), --添加检查约束,年龄在18至30岁
Sdept char(2) NOT NULL,
Ssex char(2) NOT NULL
)
GO
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'Course')
DROP TABLE Course
--创建课程名
CREATE TABLE Course
(
Cno int NOT NULL --课程号
CONSTRAINT PK_Cno PRIMARY KEY CLUSTERED,
Cname varchar(10) NOT NULL, --课程名
Cpno int NULL --先行课
CONSTRAINT DF_Cpno DEFAULT(0),
Ccredit int NOT NULL, --学分
)
GO
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'SC')
DROP TABLE SC
--创建学生选课表
CREATE TABLE SC
(--参照表
Sno nchar(9) NOT NULL
FOREIGN KEY(Sno) REFERENCES Student(Sno), --外键引用
Cno int NOT NULL
FOREIGN KEY(Cno) REFERENCES Course(Cno),
Grade int Not NULL
CONSTRAINT CK_Grade CHECK(Grade>0 and Grade<100)
)
GO
创建好后的表