SQL Server
[TOC]
1章
l 数据库由一些持久的相互关联的数据的集合组成,并以一定的组织形式存放在计算机的存储介质中。
l 数据、数据库、数据库管理系统与操作数据库的应用程序,加上支撑它们的硬件平台、软件平台和与数据库有关的人员一起构成了一个完整的数据库系统。
l 数据模型:层次、网状、关系
l SQL语言的功能包括数据查询、数据操纵、数据定义和数据控制4部分。
l 实体之间的联系主要有:一对一、一对多、多对多
l SQL Server 2008有两个选项:Windows身份验证模式和混合模式。
2章
| 用户可以给出两种对象名,即完全限定名和部分限定名。详见
- 完全限定名。在SQL Server 2008中,完全限定名是对象的全名,包括4个部分:服务器名、数据库名、数据库架构名和对象名。
- 对象全名的4个部分中的前3个部分均可以省略,当省略中间的部分时,圆点符“.”不可省略。
l SQL Server 2008中有两个主要的数据存储单位:页和区。页是用于数据存储的最基本单位。区是用于管理空间的基本单位。详见
1 | SQL Server 2008中有两个主要的数据存储单位:页和区。 |
l SQL Server 2008所使用的文件包括以下三类文件。详见
(1)主数据文件。其默认扩展名为.mdf。
(2)辅助数据文件。默认扩展名为.ndf。辅助文件是可选的,也可以不使用辅助文件。一般当数据库很大时,有可能需要创建多个辅助文件。而当数据库较小时,则只需要创建主文件而不需要创建辅助文件。
(3)日志文件。扩展名为.ldf
SQL Server 2008所使用的文件包括以下三类文件。 (1)主数据文件。主数据文件简称主文件,正如其名字所示,该文件是数据库的关键文件,包含了数据库的启动信息,并且存储数据。每个数据库必须有且仅能有一个主文件,其默认扩展名为.mdf。可直接拷贝 (2)辅助数据文件。辅助数据文件简称辅(助)文件,用于存储未包括在主文件内的其他数据。辅助文件的默认扩展名为.ndf。辅助文件是可选的,根据具体情况,可以创建多个辅助文件,也可以不使用辅助文件。一般当数据库很大时,有可能需要创建多个辅助文件。而当数据库较小时,则只需要创建主文件而不需要创建辅助文件。 (3)日志文件。日志文件用于保存恢复数据库所需的事务日志信息。每个数据库至少有一个日志文件,也可以有多个,日志文件的扩展名为.ldf。日志文件的存储与数据文件不同,它包含一系列记录,这些记录的存储不以页为存储单位。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
l 在安装SQL Server 2008时,系统将创建4个可见的系统数据库:master、model、msdb和tempdb。[详细](https://zlogs.net/note/learn-sql/page/11249.html?h=tempdb)
+ (1)master数据库包含了**SQL Server 2008的登录账号、系统配置、数据库位置及数据库错误信息**等,控制用户数据库和SQL Server的运行。
+ (2)model数据库为**新创建的数据库提供模板**。
+ (3)msdb数据库为“SQL Server代理”**调度信息和作业记录**提供存储空间。
+ (4)tempdb数据库为**临时表和临时存储过程**提供存储空间,所有与系统连接的用户的临时表和临时存储过程都存储于该数据库中。
l 在SQL Server 2008中,创建数据库快照也使用CREATE DATABASE命令.[详细](https://zlogs.net/note/learn-sql/page/11046.html?h=%E5%BF%AB%E7%85%A7)
```sql
(5)恢复到数据库快照。可以使用RESTORE语句将数据库恢复到创建数据库快照时的状态。此时恢复的数据库会覆盖原来的数据库。
语法格式:
RESTORE DATABASE { database_name | @database_name_var }
FROM DATABASE_SNAPSHOT = database_snapshot_name
【例8.10】 创建PXSCJ数据库的快照,并将数据库恢复到创建该快照时的状态。
首先创建PXSCJ数据库的快照:
CREATE DATABASE PXSCJ_1
ON
(
NAME=PXSCJ,
FILENAME='E:\data\PXSCJ_1.mdf'
)
AS SNAPSHOT OF PXSCJ
GO
接着对数据库做一些修改,以确定数据库是否恢复。恢复数据库的语句如下:
USE master
GO
RESTORE DATABASE PXSCJ
FROM DATABASE_SNAPSHOT='PXSCJ_1'
l 视图与表的区别:
- 由于视图本身并不存储实际数据,因此也可以称之为虚表。视图中的数据来自定义视图的查询所引用的基本表,并在引用时动态生成数据。当基本表中的数据发生变化时,从视图中查询出来的数据也随之改变。视图一经定义,就可以像基本表一样被查询、修改、删除和更新了。
课件例2.5、2.7
1 | 【例2.5】 创建一个名为TEST1的数据库,其初始大小为5 MB,最大大小为50 MB,允许数据库自动增长,增长方式是按10%比例增长。日志文件初始为2 MB,最大可增长到5 MB,按1 MB增长。数据文件和日志文件的存放位置为SQL Server的数据库目录“C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\ MSSQL\DATA”。假设SQL Server服务已启动,并以系统管理员身份登录计算机。 |
3章
l varchar、nvarchar、varbinary这三种数据类型可以使用MAX关键字
如varchar(MAX)、nvarchar(MAX)、varbinary(MAX),
加了MAX关键字的这几种数据类型最多可存放$2^{31}-1$字节的数据,分别用来替换text、ntext和image数据类型。详见
varchar(MAX)小于varchar时等于varchar,当大于时,会自动扩充到系统允许范围,如fat32最大允许单文件4GB,MSSQL想用他取代text,因为text有其他操作无法实现如=等,其他同理,数据库迁移时,在MariaDB中获得类似存储大小的唯一方法是使用
LONGBLOB
数据类型。
l 当用户使用界面方式修改表的结构(如添加列、修改列的数据类型等)时,必须删除原来的表,再重新创建新表才能完成表的更改。当表中有了记录后,建议不要轻易改变表结构,特别不要改变数据类型,以免产生错误。具有以下特性的列不能修改:详见
- 数据类型为timestamp的列;
- 计算列;
- 全局标识符列;
- 用于索引的列(但当用于索引的列为varchar、nvarchar或varbinary数据类型时,可以增加列的长度);
- 用于由CREATE STATISTICS生成统计的列,如需修改这样的列,则必须先用DROP STATISTICS语句删除统计;
- 用于主键或外键约束的列;
- 用于CHECK或UNIQUE约束的列;
- 关联有默认值的列。
时间戳+全局标识符+有约束(主外键、默认、非空、check、unique)+计算列
|当改变列的数据类型时,要求满足下列条件:
- 原数据类型必须能够转换为新数据类型。
- 新数据类型不能为timestamp类型。
- 如果被修改列属性中有“标识规范”属性,则新数据类型必须是有效的“标识规范”数据类型。
l 使用TRUNCATE TABLE语句删除表数据 详细
1 | 使用TRUNCATE TABLE语句删除表数据 |
l 讨论数据类型时,使用了精度、小数位数和长度3个概念,它们的含义如下。详细
- 精度:指数值数据中所存储的十进制数据的总位数。
- 小数位数:指数值数据中小数点右边可以有的数字位数的最大值。例如,数值数据3890.587的精度是7,小数位数是3。
- 长度:指存储数据所使用的字节数。详细
| 使用T-SQL语句创建分区表 详细
- (1)创建分区函数
- (2)创建分区方案
- (3)使用分区方案创建分区表。
1 | 1.使用T-SQL语句创建分区表 |
| 新增加了一个MERGE语句:详细
例3.22创建表a,要求表中数据与XSB表同步。
1 | 【例3.22】 创建表a,要求表中数据与XSB表同步。 |
1 | 【例3.5】 设已经创建了数据库PXSCJ,现在该数据库中需创建学生情况表XSB,该表的结构见表3.3。创建表XSB的T-SQL语句如下: |
https://zlogs.net/note/learn-sql/page/11263.html
1 | 【例3.14】 假设上表XSB中专业的默认值为“计算机”,备注默认值为NULL,则插入上例数据可以使用以下命令: |
1 | 【例3.18】 将PXSCJ数据库的XSB表中总学分大于52的行删除,使用如下语句: |
1 | 【例3.21】 将XSB表(数据以附录A中XSB表的样本数据为准)中所有学生的总学分都增加10。将姓名为“罗林琳”的同学的专业改为“软件工程”,备注改为“提前修完学分”,学号改为081261。 |
1 | 【例4.4】 查询XSB表中计算机系同学的学号、姓名和总学分,结果中各列的标题分别指定为number、name和mark。 |
1 | 【例4.27】 查找选修了课程号为206的课程的学生情况。 |
1 | 【例4.61】 生成一个结果集,分别根据专业和性别对人数进行聚合。 |
1 | 与WHERE子句的查询条件类似,不过HAVING子句中可以使用聚合函数,而WHERE子句中不可以。 |
1 | 【例4.65】 将通信工程专业的学生按出生时间先后顺序排序。 |
1 | 【例4.70】 查找学号为081101和学号为081210的两位同学的信息。 |
1 | 【例4.42】 查找PXSCJ数据库每个学生的情况以及选修的课程情况。 |
4章
| 专门的关系运算包括:选择/投影和连接
https://zlogs.net/note/learn-database-principle/page/1037.html?h=%E6%8A%95%E5%BD%B1
https://zlogs.net/note/learn-database-principle/page/1041.html?h=%E6%8A%95%E5%BD%B1
| 外连接分类LEFT | RIGHT | FULL
1 | 【例4.44】 查找选修了206号课程且成绩在80分以上的学生姓名及成绩。 |
| 在使用视图时,要注意下列事项:
- (1)只有在当前数据库中才能创建视图。视图的命名必须遵循标识符命名规则,不能与表同名。
- (2)不能把规则、默认值或触发器与视图相关联。
https://zlogs.net/note/learn-sql/page/11273.html
l 外连接。指定了OUTER关键字的为外连接,外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接包括以下三种。
- 左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行;
- 右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行;
- 完全外连接(FULL OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。
- 其中的OUTER关键字均可省略。
1 | 【例4.50】 查找所有学生情况,以及他们选修的课程号,若学生未选修任何课,也要包括其情况。 |
l 使用视图有下列优点:
- (1)为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户进行数据查询和处理。
- (2)屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。
- (3)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。
- (4)便于数据共享。各用户不必都定义和存储自己所需的数据,而可共享数据库的数据,这样,同样的数据只需存储一次。
- (5)可以重新组织数据以便输出到其他应用程序中。
1 | 【例7.16】 在PXSCJ数据库中创建视图stu_view,包含学生学号、专业、课程号、成绩。该视图依赖于表XSB和CJB,是不可更新视图。可以在视图上创建INSTEAD OF触发器,当向视图中插入数据时分别向表XSB和CJB插入数据,从而实现向视图插入数据的功能。 |
l 用来创建视图的SELECT语句,有以下限制:
- ① 定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限;
- ② 不能使用COMPUTE或COMPUTE BY子句;
- ③ 不能使用ORDER BY子句;
- ④ 不能使用INTO子句;
- ⑤ 不能在临时表或表变量上创建视图。
1 | 【例4.75】 创建CS_KC视图,包括计算机专业各学生的学号、其选修的课程号及成绩。要保证对该视图的修改都符合“专业为计算机”这一条件。 |
l 游标分类及SQL Server对游标的使用过程:
- 前端(客户端)游标和后端(服务器端)游标。“声明游标→打开游标→读取数据→关闭游标→删除游标”。
使用两种方式定义列别名【例4.4】 替换查询结果中的数据例4.5
1 | 【例4.4】 查询XSB表中计算机系同学的学号、姓名和总学分,结果中各列的标题分别指定为number、name和mark。 |
常用聚合函数的使用4.9-4.15
1 | SUM /AVG ( [ ALL | DISTINCT ] expression ) |
分类汇总的使用
https://zlogs.net/note/learn-sql/page/11272.html?h=%E5%88%86%E7%B1%BB%E6%B1%87%E6%80%BB
1 | ORDER BY子句可以与COMPUTE BY子句一起使用,在对结果排序的同时还产生附加的汇总行。COMPUTE子句用于分类汇总,将产生额外的汇总行。格式为 |
5章
l 创建用户自定义数据类型时首先应考虑如下三个属性:
- 数据类型名称;
- 新数据类型所依据的系统数据类型(又称为基类型);
- 为空性。
- https://zlogs.net/note/learn-sql/page/11214.html?h=%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B
l 常规标识符:
- 以ASCII字母、Unicode字母、下划线(
_
)、@或#开头, - 后续可跟一个或若干个ASCII字符、Unicode字符、下划线(
_
)、美元符号($)、@或#, - 但不能全为下划线(
_
)、@或#。 - 标识符允许的最大长度为128个字符。
l 局部变量的赋值。
- 当声明局部变量后,可用SET或SELECT语句为其赋值。
- 一个SELECT语句可以初始化多个局部变量。
l RAND ([ seed ] ) 返回0~1之间的一个随机值。
参数seed是指定种子值的整型表达式,返回值类型为float。
如果未指定seed,则随机分配种子值。
对于指定的种子值,返回的结果始终相同。
【例5.24】 以下程序通过RAND函数返回随机值。 DECLARE @count int SET @count = 5 SELECT RAND(@count)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
+
+ <https://zlogs.net/note/learn-sql/page/11281.html?h=RAND>
l 根据用户定义函数返回值的类型,可将用户定义函数分为如下两个类别。
+ (1)标量函数
+ (2)表值函数
l 什么是SQL语言,微软SQL-Serve和甲骨文公司Oracle使用的SQL语言各是什么?
> SQL语言的全名是结构化查询语言(Structured Query Language),是用于数据库中的标准数据查询语言,IBM公司最早使用该语言在其开发的数据库系统中。1986年10月,美国ANSI对 SQL进行规范后,以此作为关系数据库管理系统的标准语言。
> 微软公司的MS SQL-Server支持的是T-SQL,而甲骨文公司的Oracle 数据库所使用的SQL语言则是PL-SQL。
【例5.20】 将学号为081101的学生的总学分使用循环修改到60,每次只加2,并判断循环了多少次。
# **6章**
l 计算列为**text、ntext或image**列时也**不能在该列上创建索引**。
l 规则是一组使用T-SQL语句组成的条件语句,规则提供了另外一种在数据库中实现域完整性与用户定义完整性的方法。规则对象的使用方法与默认值对象的使用步骤类似。
+ ① 定义规则对象;
+ ② 将规则对象绑定到列或用户自定义类型。
+ <https://zlogs.net/note/learn-sql/page/11339.html?h=%E5%AE%9A%E4%B9%89%E8%A7%84%E5%88%99%E5%AF%B9%E8%B1%A1>
+ ```sql
规则是一组使用T-SQL语句组成的条件语句,规则提供了另外一种在数据库中实现域完整性与用户定义完整性的方法。规则对象的使用方法与默认值对象的使用步骤类似。
① 定义规则对象;
② 将规则对象绑定到列或用户自定义类型。
在SQL Server 2008中,规则对象的定义可以利用CREATE RULE语句来实现。
(1)规则对象的定义。
语法格式:
CREATE RULE [ schema_name. ] rule_name
AS condition_expression
[ ; ]
(2)将规则对象绑定到用户定义数据类型或列。
将规则对象绑定到列或用户定义数据类型中可以使用系统存储过程sp_bindrule。
语法格式:
sp_bindrule [ @rulename = ] 'rule' ,
[ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]
(3)应用举例。
【例6.18】 如下程序创建一个规则,并绑定到表KCB的课程号列,用于限制课程号的输入范围。
USE PXSCJ
GO
CREATE RULE kc_rule
AS @range like '[1-5][0-9][0-9]'
GO
EXEC sp_bindrule 'kc_rule', 'KCB.课程号' /*执行存储过程使用EXEC命令*/
GO
程序如果正确执行将提示:“已将规则绑定到表的列”。
【例6.19】 创建一个规则,用以限制输入到该规则所绑定的列中的值只能是该规则中列出的值。
CREATE RULE list_rule
AS @list IN ('C语言', '离散数学', '微机原理')
GO
EXEC sp_bindrule 'list_rule', 'KCB.课程名'
GO
【例6.20】 如下程序定义一个用户数据类型course_num,然后将前面定义的规则“kc_rule”绑定到用户数据类型course_num上,最后创建表KCB1,其课程号的数据类型为course_num。
CREATE TYPE course_num
FROM char(3) NOT NULL /*创建用户定义数据类型*/
EXEC sp_bindrule 'kc_rule', 'course_num' /*将规则对象绑定到用户定义数据类型*/
GO
CREATE TABLE KCB1
(
课程号 course_num, /*将学号定义为course_num类型*/
课程名 char(16) NOT NULL,
开课学期 tinyint ,
学时 tinyint,
学分 tinyint
)
GO
(4)规则对象的删除。在删除规则对象前,首先应使用系统存储过程sp_unbindrule解除被绑定对象与规则对象之间的绑定关系,使用格式如下:
sp_unbindrule [@objname =] 'object_name'
[, [@futureonly =] 'futureonly_flag']
在解除列或自定义类型与规则对象之间的绑定关系后,就可以删除规则对象了。
语法格式:
DROP RULE { [ schema_name . ] rule_name } [ ,...n ] [ ; ]
【例6.21】 解除规则kc_rule与列或用户定义类型的绑定关系,并删除规则对象kc_rule。
EXEC sp_unbindrule 'KCB.课程号'
EXEC sp_unbindrule 'course_num'
GO
DROP RULE kc_rule
| 在删除规则对象前,首先应使用系统存储过程sp_unbindrule解除被绑定对象与规则对象之间的绑定关系
l 建立索引主要有以下作用:
- 快速存取数据;
- 保证数据记录的唯一性;
- 实现表与表之间的参照完整性;
- 在使用ORDER BY、GROUP BY子句进行数据检索时,利用索引可以减少排序和分组的时间。
l 索引的分类及含义:
- 聚集索引和非聚集索引
聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致
非聚集索引完全独立于数据行的结构。
只有在表上创建聚集索引时,表内的行才按特定顺序存储,这些行按聚集索引键顺序存储。如果一个表只有非聚集索引,则它的数据行将按无序的堆集方式存储。
利用“T-SQL命令”创建及删除PRIMARY KEY约束或UNIQUE约束 利用T-SQL命令可以使用两种方式定义约束:作为列的约束或作为表的约束。可以在创建表或修改表时定义。 (1)在创建表的同时创建PRIMARY KEY约束或UNIQUE约束。 语法格式: CREATE TABLE table_name ( { <列定义> <column_constraint>}[,…n] [ <table_constraint> ] [ ,...n ] ) 其中,<column_constraint>为列的约束,<table_constraint>为表的约束。 <column_constraint> ::= /*定义列的约束*/ [ CONSTRAINT constraint_name ] { { PRIMARY KEY | UNIQUE } /*定义主键与UNIQUE键*/ [ CLUSTERED | NONCLUSTERED ] /*定义约束的索引类型*/ [WITH ( < index_option > [ , ...n ] ) ] [ ON { partition_scheme_name ( partition_column_name ) | filegroup | "default" } ] | [ FOREIGN KEY ] <reference_definition> /*定义外键*/ | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) /*定义CHECK约束*/ } < table_constraint > ::= /*定义表的约束*/ [ CONSTRAINT constraint_name ] /*指定名称方便删除*/ { { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ ,...n ] ) /*定义表的约束时需要指定列*/ [WITH ( <index_option> [ , ...n ] ) ] [ ON { partition_scheme_name (partition_column_name) | filegroup | "default" } ] | FOREIGN KEY ( column [ ,...n ] ) <reference_definition> | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) } 【例6.9】 创建XSB1表(假设XSB1表未创建),并对“学号”字段创建PRIMARY KEY约束,对“姓名”字段定义UNIQUE约束。 USE PXSCJ GO CREATE TABLE XSB1 ( 学号 char(6) NOT NULL CONSTRAINT XH_PK PRIMARY KEY, 姓名 char(8) NOT NULL CONSTRAINT XM_UK UNIQUE, 性别 bit NOT NULL DEFAULT 1, 出生时间 date NOT NULL, 专业 char(12) NULL, 总学分 int NULL, 备注 varchar(500) NULL ) 【例6.10】 创建一个course_name表来记录每门课程的学生学号、姓名、课程号、学分和毕业日期。其中,学号、课程号和毕业日期构成复合主键,学分为唯一键。 CREATE TABLE course_name ( 学号 varchar(6) NOT NULL, 姓名 varchar(8) NOT NULL, 毕业日期date NOT NULL, 课程号 varchar(3) , 学分 tinyint, PRIMARY KEY (学号, 课程号, 毕业日期), CONSTRAINT XF_UK UNIQUE (学分) ) (2)通过修改表创建PRIMARY KEY约束或UNIQUE约束。 使用ALTER TABLE语句中的ADD子句可以为表中已存在的列或新列定义约束,语法格式参见第3章中ALTER TABLE语句的ADD子句。 【例6.11】 修改例6.14中的XSB1表,向其中添加一个“身份证号码”字段,对该字段定义UNIQUE约束。对“出生时间”字段定义UNIQUE约束。 ALTER TABLE XSB1 ADD 身份证号码 char(20) CONSTRAINT SF_UK UNIQUE NONCLUSTERED (身份证号码) GO ALTER TABLE XSB1 ADD CONSTRAINT CJSJ_UK UNIQUE NONCLUSTERED (出生时间) (3)删除PRIMARY KEY约束或UNIQUE约束。 删除PRIMARY KEY约束或UNIQUE约束需要使用ALTER TABLE的DROP子句。 语法格式: ALTER TABLE table_name DROP CONSTRAINT constraint_name [ ,...n ] 【例6.12】 删除例6.14中创建的PRIMARY KEY约束和UNIQUE约束。 ALTER TABLE XSB1 DROP CONSTRAINT XH_PK, XM_UK GO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
+
l 数据完整性的分类
+ 数据完整性是指数据库中的数据在逻辑上的一致性和准确性。数据完整性一般包括三种。
+ 1.实体完整性--主键约束
+ 2.域完整性--check 列完整性
+ 3.参照完整性--外键 引用完整性
+ <https://zlogs.net/note/learn-sql/page/11339.html>
l 如果定义了两个表之间的参照完整性,则要求:
+ (1)从表不能引用不存在的键值。
+ > 例如,CJB表中行记录出现的学号必须是XSB表中已存在的学号。
+ (2)如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一致的更改。
+ > 例如,如果对XSB表中的某一学号修改,则CJB表中所有对应学号也要进行相应的修改。
+ (3)如果主表中没有关联的记录,则不能将记录添加到从表。
+ (4)如果要删除主表中的某一记录,则应先删除从表中与该记录匹配的相关记录。
l PRIMARY KEY约束与UNIQUE约束的主要区别如下:
(1)一个数据表只能创建一个PRIMARY KEY约束,但一个表中可根据需要对表中不同的列创建若干个UNIQUE约束。
(2)PRIMARY KEY字段的值不允许为NULL,而UNIQUE字段的值可取NULL。
(3)一般在创建PRIMARY KEY约束时,系统会自动产生索引,索引的默认类型为簇索引。在创建UNIQUE约束时,系统会自动产生一个UNIQUE索引,索引的默认类型为非簇索引。
创建表的同时添加外键约束,例6.22-6.23
```sql
利用“T-SQL命令”定义表间的参照关系
前面已介绍了创建主键(PRIMARY KEY约束)及唯一键(UNIQUE约束)的方法,在此将介绍通过T-SQL命令创建外键的方法。
(1)创建表的同时定义外键约束。
语法格式在6.3.2小节中已经列出,这里只列出定义外键部分的语法。
CREATE TABLE table_name /*指定表名*/
(<column_definition>
[ CONSTRAINT constraint_name ]
[ FOREIGN KEY ][ ( column [ ,...n ] )] <reference_definition>
)
其中,
<reference_definition>::=
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
/*忽略, 级联跟着变, */
[ NOT FOR REPLICATION ]
【例6.22】 创建stu表,要求stu表中所有的学生学号都必须出现在XSB表中,假设已经使用“学号”列作为主键创建了XSB表。
USE PXSCJ
GO
CREATE TABLE stu
(
学号 char(6) NOT NULL FOREIGN KEY (学号) REFERENCES XSB (学号),
姓名 char(8) NOT NULL,
出生时间 datetime NULL
)
【例6.23】 创建point表,要求表中所有的学号、课程号组合都必须出现在CJB表中。
CREATE TABLE point
(
学号 char(6) NOT NULL,
课程号 char(3) NOT NULL,
成绩 int NULL,
CONSTRAINT FK_point FOREIGN KEY (学号,课程号) REFERENCES CJB (学号,课程号)
ON DELETE NO ACTION
)
(2)通过修改表定义外键约束。
【例6.24】 假设KCB表为主表,KCB的“课程号”字段已定义为主键。CJB表为从表,如下示例用于将CJB表的“课程号”字段定义为外键。
ALTER TABLE CJB
ADD CONSTRAINT kc_foreign
FOREIGN KEY (课程号)
REFERENCES KCB(课程号 )
7章
l 通过EXECUTE或EXEC命令可以执行一个已定义的存储过程
l 触发器分为两大类:DML触发器和DDL触发器。
l 在执行UPDATE触发器时,将触发器表的原记录保存到deleted临时表中,将修改后的记录保存到inserted临时表中。
l INSTEAD OF触发器触发时只执行触发器内部的SQL语句,而不执行激活该触发器的SQL语句。一个表或视图中只能有一个INSTEAD OF触发器。
l 使用存储过程的优点如下:
- (1)存储过程在服务器端运行,执行速度快。
- (2)存储过程执行一次后,就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。
- (3)使用存储过程可以完成所有数据库操作,并可通过编程方式控制对数据库信息访问的权限,确保数据库的安全。
- (4)自动完成需要预先执行的任务。
l 存储过程的类型:
- 系统存储过程、扩展存储过程、用户存储过程
例7.4存储过程
1 | (4)使用带有通配符参数的存储过程。 |
例7.12-7.15触发器
1 | (4)创建UPDATE触发器。UPDATE触发器在对触发器表执行UPDATE语句后触发。在执行UPDATE触发器时,将触发器表的原记录保存到deleted临时表中,将修改后的记录保存到inserted临时表中。 |
8章
l 数据库需备份的内容可分为数据文件(又分为主要数据文件和次要数据文件)、日志文件两部分。
l 在SQL Server 2008中,允许使用两种类型的备份介质。(1)硬盘、磁带
l 当系统发现出现了以下情况时,恢复操作将不进行:
- (1)指定要恢复的数据库已存在,但在备份文件中记录的数据库与其不同;
- (2)服务器上数据库文件集与备份中的数据库文件集不一致;
- (3)未提供恢复数据库所需的所有文件或文件组。
l 创建命名备份设备时,要注意以下几点:
- ① SQL Server 2008将在系统数据库master的系统表sysdevice中创建该命名备份设备的物理名和逻辑名。
- ② 必须指定该命名备份设备的物理名和逻辑名,当在网络磁盘上创建命名备份设备时要说明网络磁盘文件路径名。
l 在复制数据库文件时,一定要先通过SQL Server配置管理器停止SQL Server服务,然后才能复制数据文件,否则无法复制。
l 具有下列角色的成员可以做备份操作:
- (1)固定的服务器角色sysadmin(系统管理员)。
- (2)固定的数据库角色db_owner(数据库所有者)。
- (3)固定的数据库角色db_backupoperator(允许进行数据库备份的用户)。
|SQL Server 2008中有4种备份方法:
- (1)完全数据库备份
- (2)数据库和事务日志备份
- (3)差异备份
- (4)数据库文件或文件组备份
l 数据库文件或文件组备份时,要注意以下几点:
- (1)必须指定文件或文件组的逻辑名;
- (2)必须执行事务日志备份,以确保恢复后的文件与数据库其他部分的一致性;
- (3)应轮流备份数据库中的文件或文件组,以使数据库中的所有文件或文件组都定期得到备份;