1. 程式人生 > >SQL表的建立和基本約束

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

建立好後的表