大家晚上好,昨天我们讲到了常见表的相关指令,主键、唯一、自动增长和唯一约束。今天我们继续学习外键约束和索引相关知识,以及更改表和删除表的指令。
先来看一下外键,外键主要是用来约束用于预防破坏表之间连接的动作。我们用一个例子来说明一下:
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijin |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
“Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。通过建立外键就把两个表建立起了关联,这对查询很有用的。
OK,我们在来看一下索引。索引主要是在不读取全表的时候加速查询。SQL Server中主要分为两种:聚集索引和非聚集索引。聚集索引主要特点就是调整索引表顺序的同时也会调整原表的顺序。当创建主键时自动创建聚集索引。一个表只能有一个主键,同样一个表也只能有一个聚集索引。一个聚集索引表最多有16列。非聚集索引就是调整表索引表的同时不会改变原表的顺序。当创建唯一约束时自动创建非聚集索引。一个非聚集索引表最多有249列。
唯一索引表示表中任何两个记录的索引值都不同的。
USE TestDB;--昨天我们讲的创建约束都是在定义列时直接建立的,今天我们在介绍一个指令CONSTRAINT--用CONSTRAINT语句建立主键、唯一、默认、检查约束CREATE TABLE Stu( Sno int, Sname varchar(50), Saddr varchar(100) CONSTRAINT DF_Saddr DEFAULT '北京市', Sage int, --用constraint建立约束 CONSTRAINT PK_Sno PRIMARY KEY (Sno), CONSTRAINT UN_Sname UNIQUE (Sname DESC), CONSTRAINT CK_Sage CHECK (Sage>15));--建立外键约束CREATE TABLE Scourse( Cno int, Cname varchar(50), Tno int, Sno int FOREIGN KEY REFERENCES Stu(Sno) --用constraint建立外键约束 --CONSTRAINT FK_Scoures_Stu FOREIGN KEY(Sno) --REFERENCES Stu(Sno) --这里要注意Stu表中的Sno列一定要是主键哦^_^ --还有主键列和外键列的这个列类型要一致哦);--再建一个表,下面的例子用CREATE TABLE Teacher( Tno int, Tname varchar(50), Tage int, CONSTRAINT PK_Teacher PRIMARY KEY(Tno));--修改表,前面修改数据库我们用的是ALTER DATABASE,我们这里也是用ALTER--增加列ALTER TABLE Teacher ADD Taddr varchar(200);--修改列ALTER TABLE Teacher ALTER COLUMN Taddr varchar(100);--删除列ALTER TABLE Teacher DROP COLUMN Taddr;--增加约束,和上面用constraint建立约束一样的--这里就增加一个外键了ALTER TABLE Scourse ADD CONSTRAINT FK_Teacher FOREIGN KEY(Tno) REFERENCES Teacher(Tno);--删除约束ALTER TABLE Scourse DROP FK_Teacher;--搜狗输入法在SQL Server里好难用啊,总变成全角的--这里再增加一个默认约束,注意一下是怎么指定列的?ALTER TABLE Teacher ADD CONSTRAINT DF_Tage DEFAULT 35 FOR Tage;--删除表DROP TABLE Scourse;--我想留个作业,所以索引就下次再说吧!--要认真做作业联系哦,我们将查询的时候要用今天作业里的数据库和表(⊙o⊙)
作业:
建立一个数据库,数据库名SaleInfoDB
建立下表:
表名:ShopInfo(商场信息) | |||
列 | 列类型 | 空约束 | |
ShopID | char(4) | NOT NULL | 主键 |
ShopName | char(20) | NOT NULL | |
ShopAddr | char(20) | NOT NULL | |
Phone | char(11) | NOT NULL | 唯一约束 |
DayTotal | float | ||
表名:ShopSell(商场销售信息) | |||
列 | 列类型 | 空约束 | |
ShopId | char(4) | NOT NULL | |
ProdID | char(6) | NOT NULL | |
SellCount | int | NOT NULL | |
SellDate | datetime | NOT NULL | |
SalerID | char(4) | NOT NULL | |
表名:ProductInfo | |||
ProdID | char(4) | NOT NULL | |
ProdNmae | char(10) | NOT NULL | |
Price | float | NOT NULL | |
ProdFact | char(20) | NOT NULL | 默认"华为" |
ProdAddr | char(20) | NOT NULL | |
FactPhone | char(11) | NOT NULL | |
StockCount | int | NOT NULL | |
表名:SalerInfo | |||
SalerID | char(4) | NOT NULL | 主键 |
SalerName | char(6) | NOT NULL | |
SalerAge | int | ||
SalerSex | char(2) | NOT NULL | |
SalerPhone | char(11) | ||
Salary | float | ||
外键约束 | |||
主键表 | 主键列 | 外键表 | 外键列 |
ProductInfo | ProdID | ShopSell | ProdID |
检查约束 | |||
表名 | 列名 | 条件 | |
SalerInfo | SalerSex | 只能是"男"或"女" |