SQL表的创建和基本约束

学习用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

创建好后的表



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值