SQL表的建立和基本約束
阿新 • • 發佈:2019-01-08
學習用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
建立好後的表