第7章 管理表
教学目标
l 理解表的特点、类型和创建表时需要考虑的因素
l 熟练掌握创建和修改表技术
l 不仅要理解标识符列的作用、特点和类型
l 理解已分区表的特点和作用
7.1 概述
7.1.1 表的特点
l 定义:
表是用来组织和存储数据、具有行列结构的数据库对象。
l 特点:
– 代表实体,有唯一的名字
– 由行和列组成
– 行和列的顺序是不重要的
Student表:
7.1.2 表的类型
表分为4种类型,即普通表、已分区表、临时表和系统表。
7.1.3 设计表时应该考虑的因素
l 因素一,该表将要存储的数据对象,并且绘制出ER图。
l 因素二,表中将要包含的列,这些列的数据类型、精度等属性是什么?
l 因素三,哪些列允许空值,哪些列不允许空值?
l 因素四,是否使用主键,在何处使用主键?
l 因素五,是否使用约束、默认值、规则,以及在何处使用这些对象?
l 因素六,是否使用外键,在何处使用外键?
l 因素七,是否使用索引,在何处使用索引,使用什么样的索引?
7.2 创建和修改表
介绍:学校管理数据库
Student:学生表
列名 |
类型 |
特征 |
备注 |
sno |
Char(10) |
主键 |
学号 |
… |
|
|
|
Class:班级表
列名 |
类型 |
特征 |
备注 |
clsno |
Char(10) |
主键 |
班级编号 |
… |
|
|
|
teacher:教师表
列名 |
类型 |
特征 |
备注 |
tno |
Char(10) |
主键 |
教师编号 |
… |
|
|
|
course:课程表
列名 |
类型 |
特征 |
备注 |
cno |
Char(10) |
主键 |
课程编号 |
… |
|
|
|
Score:成绩表
列名 |
类型 |
特征 |
备注 |
Id |
|
|
编号 |
sno |
|
外键 |
学号 |
Cno |
|
外键 |
课程号 |
score |
|
|
成绩 |
Mk_score |
|
|
补考成绩 |
Tcc:授课表
列名 |
类型 |
特征 |
备注 |
Id |
int |
主键 |
编号 |
date |
|
|
时间 |
tno |
|
外键 |
教师编号 |
clsno |
|
外键 |
班级编号 |
cno |
|
外键 |
课程编号 |
value |
|
|
评价 |
7.2.1 创建表
l 1 在MS中完成student表的创建。
l 2 使用CREATE TABLE语句创建表。
l 语法:
create table 表名
(
列名1 类型 约束 ,
列名2 类型 约束 ,
列名3 类型 约束 ,
…
列名n 类型 约束
)
--教师表
if exists(select name from sysobjects
where name='teacher' and type='u')
drop table teacher
--teacher表
create table teacher
(
tno char(10) primary key ,--教师编号
tname varchar(20) not null, --教师姓名
title varchar(20), --职位
birthdate datetime ,--出生日期
hirdate datetime ,--受聘日期
quitdate datetime,--离职时间
uptno char(10) ,--上级领导
gender char(2),---性别
photo image,--照片
notes ntext --备注
)
--班级表
if exists(select name from sysobjects
where name='class' and type='u')
drop table class
--class 表格
create table class
(
clsno char(10) primary key,--班级编号
clsname char(20) ,--班级名称
credate datetime,--创建日期
leavedate datetime,--毕业时间
teacher char(10),--班主任
clstype varchar(20),--班级类型
notes text, --备注
numbers int --班级人数
)
--学生表
if exists(select name from sysobjects
where name='student' and type='u')
drop table student
--student表
create table student
(
sno char(10) primary key ,--学号
sname varchar(20) not null,--姓名
idcard char(18) ,--身份证
gender char(2) ,--性别
birthdate datetime ,--出生日期
homeaddress varchar(100),--出生地
phone varchar(20),--联系电话
email varchar(50),--电子邮箱
qq varchar(10) ,--qq号码
hoby varchar(20),--爱好
classid char(10) --班级
)
--课程表
if exists(select name from sysobjects
where name='course' and type='u')
drop table course
--course表
create table course
(
cno char(10) primary key,--课程编号
cname varchar(50) ,--课程名称
c1_times int ,--理论课时
c2_times int ,--实践课时
ctype char(10),--学历课还是技能课
nots text --备份
)
--学生成绩表
if exists(select name from sysobjects
where name='score' and type='u')
drop table score
create table score
(
id int IDENTITY(1,1) NOT NULL,--编号
sno char(10) ,--学号
cno char(10),--课程编号
score decimal(5, 2) ,--成绩
mk_score decimal (5, 2)—补考成绩
)
--教师授课表
if exists(select name from sysobjects
where name='tcc' and type='u')
drop table tcc
create table tcc (
id nchar (10) ,--编号
date datetime ,--授课日期
tno char (10) ,--教师编号
clsno char (10) ,--班级编号
cno char (10) ,--课程编号
evalue varchar (50) --评价
)
--用户表
CREATE TABLE users--用户表
(
id int IDENTITY(1,1) NOT NULL,--用户编号
username varchar(50) ,--用户名
password int NULL--密码
)
创建带有计算列的表格
(1) SSMS中完成
(2) 代码完成
CREATE TABLE orders1 (
ord_id int NULL,
goodsname varchar (50) ,
price money NULL,
num int NULL,
total AS ( price * num ) PERSISTED
)
创建自增列的表格
(1) SSMS中完成
(2) 代码完成
ord_id int identity(1,2) not null,
price money NULL,
num int NULL,
total AS ( price * num ) PERSISTED
)
创建临时表
临时表的前面以#或者##开头
(1) SSMS中完成
(2) 代码完成
create table ##test
(a int ,
b int
)
对于约束的内容查看课本相关章节,后续会介绍。
7.2.2 修改表
1.增加列
表创建之后,用户可以根据需要使用ALTER TABLE语句来修改表的结构。
语法:
ALTER TABLE 表名
ADD字段名 数据类型[(长度)][ null| not null] [ default ‘ 默认值’ ] [identity]
注意:
(1)新增加字段时可以同时设置空值约束、默认值约束和标识列。
(2)表中的列名必须唯一
(3)若不允许为空时则必须给新增加的列指定默认值,否则语句执行错误。
ALTER TABLE 只允许添加满足下述条件的列: 列可以包含空值;或者列具有指定的DEFAULT 定义;或者要添加的列是标识列或时间戳列;或者,如果前几个条件均未满足,则表必须为空以允许添加此列。不能将列"f"添加到非空表"test"中,因为它不满足上述条件。
例题1:创建测试表test,包含一个整形列a
--创建表test
create table test
(a int)
--(1)为表test添加新列b,类型为整形,可以为空
alter table test
add b int
--(2)为表test添加新列c,类型varchar(20),不允许空
alter table test
add c varchar(20) not null
给表中插入一行数据后再执行此操作:
insert into test values
(1,2,'aaa');
alter table test
add d varchar(20) not null
消息4901,级别16,状态1,第1 行
出现错误,思考为什么?如何改正?
alter table test
add d varchar(20) not null default 'hehe'
--(3)为表test添加2列e和f,都是varchar(20)类型,允许空
alter table test
add e varchar(20),f varchar(20)
--(4)添加计算列,g=c+d+e。此处+的含义是字符串连接。
alter table test
add g as c+d+e
--(4)添加标识列
alter table test
add h int identity(1001,1)
看下面代码
alter table test
add i int identity(1001,1) default 3
消息1754,级别16,状态0,第1 行
不能在具有IDENTITY 属性的列上创建默认值。表'test',列'i'。
消息1750,级别16,状态0,第1 行
无法创建约束。请参阅前面的错误消息。
为什么?
2.删除列
语法:
alter table <表名>
drop column 字段名 [ , …n ]
如果要删除的列上建有约束,需要先删除约束
删除约束的方法:
(1)通过sp_helpconstraint 表名找到要删除约束的名字
(2)alter table 表名 drop 约束名
--(1)删除列
alter table test
drop column f
--(2)删除多列
alter table test
drop column d,e
--(3)删除带有约束列
alter table test
drop column d
消息5074,级别16,状态1,第1 行
对象'DF__test__d__239E4DCF' 依赖于列'd'。
消息4922,级别16,状态9,第1 行
由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN d 失败
--先删除d上的默认约束,找到约束名
sp_helpconstraint test
注意:约束名随机生成,不同机器名称不同。
--删除约束
alter table test
drop DF__test__d__239E4DCF
--删除列
alter table test
drop column d
7.2.3 修改列
使用alter column子句可修改字段的数据类型、长度、是否允许为空值等属性。
语法:
ALTER TABLE 表名
alter column 字段名 数据类型[(长度)][null|not null]
--(1)将class表中班级名称的长度改为20
alter table class
alter column clsname varchar(20)
--(2)将教师姓名长度改为,并且非空
alter table teacher
alter column tname varchar(20) not null
注意:
(1)如果表中没有数据,对表中列的数据类型的更改是任意的。如果表中包含数据,更改后的类型必须同原类型兼容。
(2)将一个原来允许为空值的列改为不允许为空时,必须保证表中已有记录中该列没有空值。
(3)改变数据类型时,如果原来设置了默认值约束,一般应解除或删除约束后再修改
--(3)将student中简历改名为简介
语法:
sp_rename '表名.原列名','新列名'
sp_rename 'student.简历','简介'
7.2.4 表格重命名
sp_rename [当前表名], [新表名]
sp_rename test,te
7.2.5 查看表的信息
--查看表格基本信息
sp_help 表名
sp_help student
--查看表格占用空间信息
sp_spaceused 表名
sp_spaceused class
--查看表格依赖关系
sp_depends 表名
sp_depends class
7.2.6 删除表
l 删除表就是将表中数据和表的结构从数据库中永久性地去除。表被删除之后,就不能再恢复该表的定义。
或者
drop table test
drop table tb
7.3 已分区表
l 如果一个表中包含了大量的、以多种不同方式使用的数据,且一般的查询不能按照预期的成本完成,则应该考虑使用已分区表。已分区表是指按照数据水平方式分区,将数据分布于一个数据库的多个不同的文件组中。在对数据进行查询或更新时,这些已分区表将被视为独立的逻辑单元。
创建分区表的主要步骤
创建分区表的主要步骤包括
第一,创建分区函数,指定如何分区;
第二,创建分区方案,指定分区函数的分区在文件组上的位置;
第三,创建使用分区方案的表。
l 可以使用CREATE PARTITION FUNCTION语句创建分区函数。
l 可以使用CREATE PARTITION SCHEME语句创建分区方案。
7.4 上机实验
l 在sales数据库中创建表下列表:
(1)在sales数据库中通过SSMS创建表departments.(部门表)
列名 |
类型 |
是否为空 |
说明 |
备注 |
dno |
Char(6) |
no |
主键 |
编号 |
dname |
Varchar(20) |
no |
|
部门名称 |
dnum |
int |
yes |
|
人数 |
locate |
Varchar(20) |
yes |
|
地址 |
(2)在sales数据库中通过SSMS创建表employees.(职工)
列名 |
类型 |
是否为空 |
说明 |
备注 |
Eno |
Char(6) |
no |
主键 |
编号 |
ename |
varChar(8) |
no |
|
姓名 |
Sex |
Char(2) |
no |
|
性别 |
Id |
Char(18) |
yes |
|
身份证 |
deptno |
Char(4) |
yes |
外键 |
部门号 |
Up_eno |
Char(6) |
yes |
外键 |
上级领 导编号 |
Tel |
Varchar(15) |
yes |
|
电话 |
Addr |
Varchar(50) |
yes |
|
地址 |
(3)在sales中使用命令创建表goods(商品)表。
列名 |
类型 |
是否为空 |
说明 |
备注 |
Gno |
Char(10) |
no |
主键 |
商品编号 |
gname |
Varchar(20) |
no |
|
商品名称 |
Type |
Varchar(20) |
yes |
|
规格型号 |
Unite |
Char(4) |
yes |
|
单位 |
avg_price |
money |
yes |
|
平均价格 |
Tolal_num |
int |
yes |
|
总库存 |
Note |
Varchar(200) |
yes |
|
备注 |
(4)在sales中使用命令创建表customer(客户)表。
列名 |
类型 |
是否为空 |
说明 |
备注 |
Cno |
Char(10) |
no |
主键 |
编号 |
cname |
Varchar(20) |
no |
|
名称 |
person |
Varchar(20) |
yes |
|
联系人 |
Tel |
Char(20) |
yes |
|
联系电话 |
Addr |
Varchar(30) |
yes |
|
地址 |
(5)在sales中创建instock (进货)表。
列名 |
类型 |
是否为空 |
说明 |
备注 |
inno |
int |
no |
主键,自动增加 |
编号 |
indate |
datetime |
no |
|
进货日期 |
gno |
Char(10) |
no |
外键 |
商品编号 |
price |
money |
yes |
|
进价 |
Num |
int |
yes |
|
数量 |
T_price |
money |
yes |
计算列 |
总金额 |
eno |
Char(6) |
yes |
外键 |
进货人 |
cno |
Char(10) |
yes |
外键 |
客户 |
(6)在sales中创建outstock (销售)表。
列名 |
类型 |
是否为空 |
说明 |
备注 |
outno |
int |
no |
主键,自动增加 |
编号 |
outdate |
datetime |
no |
|
销售日期 |
gno |
Char(10) |
no |
外键 |
商品编号 |
price |
money |
yes |
|
售价 |
Num |
int |
yes |
|
数量 |
T_price |
money |
yes |
计算列 |
总金额 |
eno |
Char(6) |
yes |
外键 |
销售人 |
cno |
Char(10) |
yes |
外键 |
客户 |