SQLServer2000学习笔记
- 格式:doc
- 大小:85.00 KB
- 文档页数:5
安装
新建数据库
也能够使用导游来创立数据库:
表设计Class:
主键拘束
Unique 拘束新加一个索引:
Check 拘束
默认值、用户定义的数据种类
新建 Student 表:
外键
关系图
在关系图中设计表:增添 Age 列:
增添 Teacher 表:
增添表记列:
增添主外键关系:
视图设计
储存过程设计
在查问剖析器中履行储存过程:
备份数据库或许用导游进行备份:
复原数据库
经过拷贝MDF 和 LDF 文件的方式备份前需要分别数据库,不然提示:
数据库保护计划
生成数据库构造脚本
删除数据库后,可经过履行导出的SQL 脚原来重修数据库:
SaleManagement 实例操练
1、创立数据库
2、创立数据库表
Product 表:
创立其余表3、关系图:
4、输入数据Dept:
Employee:
Product:
SaleForm:SaleFormDetail :
5、创立查问视图
按部门查察销售业绩:
按产品查察销售额:
6、创立储存过程。
SQL2000教程介绍SQL(Structured Query Language),结构化查询语言,是一种用于管理和操作关系型数据库的编程语言。
SQL2000是Microsoft SQL Server 2000的简称,是一种流行的关系型数据库管理系统(RDBMS)。
本教程将带您了解SQL2000的基本概念和常用操作。
目录1.安装SQL20002.连接到SQL Server3.创建数据库4.创建表5.插入数据6.查询数据7.更新数据8.删除数据9.数据库备份和还原10.结束语1. 安装SQL2000在开始学习SQL2000之前,您需要先安装SQL2000数据库管理系统。
请按照官方文档或指南来完成安装步骤。
2. 连接到SQL Server安装完成后,您需要连接到SQL Server以开始使用SQL2000。
您可以使用SQL Server Management Studio这样的图形化工具,或者使用命令行工具如SQLCMD来连接。
•使用图形化工具:打开SQL Server Management Studio,输入服务器名称、身份验证方式和登录凭据,点击连接即可连接到SQL Server。
•使用命令行工具:打开命令提示符或PowerShell,输入以下命令连接到SQL Server:sqlcmd -S 服务器名称 -U 用户名 -P 密码3. 创建数据库连接上SQL Server后,您可以创建自己的数据库来存储数据。
使用以下的SQL语句来创建数据库:CREATE DATABASE database_name;请将database_name替换为您要创建的数据库名称。
4. 创建表在数据库中,表是用于组织和存储数据的基本单位。
使用以下的SQL语句来创建表:CREATE TABLE table_name (column1 datatype,column2 datatype,...);请将table_name替换为您要创建的表名,column1、column2等为表的列名,datatype为列的数据类型。
1,数据模型:由数据结构、数据操作和数据的完整性约束组成。
2,在E-R概念模型中,信息由实体型、实体属性和实体间联系3种概念单元来表示。
3,第一范式(1NF):设R是一个关系模式,如果R中的每个属性都是不可分解的,则称R 是第一范式;第二范式(2NF):如果关系模式R是第一范式,且每个非码属性都完全依赖于码属性,则称R是第二范式;第三范式(3NF):如果关系模式是R第二范式,且没有一个非码属性传递依赖于码,则称R是第三范式。
4,Transact-SQL语句的分类如下所示:○1变量声明Transact-SQL语言可以使用两类变量,局部变量和全局变量。
○2数据定义语言(Data Definition Language,DDL),用来建立数据库及数据库对象,绝大部分以Create开头,如Create Table等○3数据控制语言(Data Control Language,DCL),用来控制数据库组件的存取访问、权限等命令,如GRANT、REVOKE等○4数据操纵语言(Data Manipulation Language,DML),用来操纵数据库中数据的命令,如SELECT、UPDATE等○5流程控制语言(Flow Control Language,FCL),用于控制应用程序流程的语句,如IF、CASE 等。
5,数据类型:整数型:bigint(8个字节,-263~263-1),int(4个字节,-231~231-1),smallint(2个字节,-215~215-1),tingyint(1个字节,0~255);小数数据类型:decimal [(p[,s])] p精度:指定小数点左边和右边可以存储的十进制数字的最大个数。
1~38 s小数位数:0~p之间的值;numeric [(p[,s])]近似数值型:float[(n)] n:1~53 取值范围:-1.79308~1.79308real 取值范围:-3.4038~3.4038字符型(字符常量必须包含在单引号或双引号中):char[(n)]:长度为n个字节的固定长度且非Unicode的字符数据,存储大小为n个字节。
目录创建数据库 JXSK: .........................................................................................................................- 1 创建 JXSK 中的表: ........................................................................................................................- 1 插入 JXSK 库中各表值: ................................................................................................................- 1 创建数据库 JIAOXUEDB:................................................................................................................- 3 创建 JIAOXUEDB 中的表: ...............................................................................................................- 3 插入 JIAOXUEDB 库中各表值: .......................................................................................................- 3 实验 4:习题 ..................................................................................................................................- 5 实验 5:习题 ..................................................................................................................................- 7 实验 6:习题 ..................................................................................................................................- 7 实验 7:习题 ..................................................................................................................................- 8 实验 8:习题 ................................................................................................................................ - 12 实验 9:习题 ................................................................................................................................ - 17 实验 10:习题 .............................................................................................................................. - 21 实验 11:习题 .............................................................................................................................. - 24 实验 12:习题 .............................................................................................................................. - 26 实验 13:习题 .............................................................................................................................. - 39 -创建数据库 jxsk: CREATE DATABASE jxsk ON (NAME=jxsk_dat,FILENAME='d:\jxsk_dat.mdf') LOG ON (NAME=jxsk_log,FILENAME='d:\jxsk_log.ldf') GO创建 jxsk 中的表: USE jxsk CREATE TABLE S( SNO CHAR(2) NOT NULL, SN CHAR(8) NOT NULL, SEX CHAR(2) NULL, AGE TINYINT NULL, DEPT CHAR(10) NULL) CREATE TABLE T( TNO CHAR(2) NOT NULL, TN CHAR(8) NOT NULL, SEX CHAR(2) NULL, AGE TINYINT NULL, PROF CHAR(10) NULL, SAL SMALLINT NULL, COMM SMALLINT NULL, DEPT CHAR(10) NULL) CREATE TABLE C( CNO CHAR(2) NOT NULL, CN CHAR(10) NOT NULL, CT TINYINT NULL, ID_TC TINYINT NULL) CREATE TABLE SC( SNO CHAR(2) NOT NULL, CNO CHAR(2) NOT NULL, SCORE TINYINT NULL) CREATE TABLE TC( TNO CHAR(2) NOT NULL, CNO CHAR(2) NOT NULL)插入 jxsk 库中各表值: USE jxskINSERT INTO S VALUES('S2','钱尔','男',18,'信息') INSERT INTO S VALUES('S3','孙姗','女',20,'信息')-1-INSERT INTO S VALUES('S4','李思','男',21,'自动化') INSERT INTO S VALUES('S5','周武','男',19,'计算机') INSERT INTO S VALUES('S6','吴丽','女',20,'自动化') INSERT INTO S VALUES('S7','李奇','男',18,'外语') INSERT INTO S VALUES('S8','古明','男',NULL,'计算机') INSERT INTO S VALUES('S9','赵亦','女',17,'计算机') INSERT INTO T VALUES('T5','张兰','女',39,'副教授',1300,2000,'信息') INSERT INTO T VALUES('T4','张雪','女',51,'教授',1600,3000,'自动化') INSERT INTO T VALUES('T3','刘伟','男',30,'讲师',900,1200,'计算机') INSERT INTO T VALUES('T2','王平','女',28,'讲师',800,1200,'信息') INSERT INTO T VALUES('T1','李力','男',47,'教授',1500,3000,'计算机') INSERT INTO C VALUES('C1','程序设计',60,1) INSERT INTO C VALUES('C2','微机原理',80,2) INSERT INTO C VALUES('C3','数字逻辑',60,3) INSERT INTO C VALUES('C4','数据结构',80,4) INSERT INTO C VALUES('C5','数据库',60,5) INSERT INTO C VALUES('C6','编译原理',60,6) INSERT INTO C VALUES('C7','操作系统',60,7) INSERT INTO SC VALUES('S2','C5',57) INSERT INTO SC VALUES('S2','C6',80) INSERT INTO SC VALUES('S2','C7',NULL) INSERT INTO SC VALUES('S3','C1',75) INSERT INTO SC VALUES('S3','C2',70) INSERT INTO SC VALUES('S3','C4',85) INSERT INTO SC VALUES('S4','C1',93) INSERT INTO SC VALUES('S4','C2',85) INSERT INTO SC VALUES('S4','C3',83) INSERT INTO SC VALUES('S5','C2',89) INSERT INTO SC VALUES('S9','C1',90) INSERT INTO SC VALUES('S9','C2',85) INSERT INTO TC VALUES('T2','C5') INSERT INTO TC VALUES('T3','C1') INSERT INTO TC VALUES('T3','C5') INSERT INTO TC VALUES('T4','C2') INSERT INTO TC VALUES('T4','C3') INSERT INTO TC VALUES('T5','C5') INSERT INTO TC VALUES('T5','C7') INSERT INTO TC VALUES('T1','C1') INSERT INTO TC VALUES('T1','C4')-2-创建数据库 jiaoxuedb: CREATE DATABASE jiaoxuedb ON (NAME=jiaoxuedb_dat,FILENAME='d:\jiaoxuedb_dat.mdf') LOG ON (NAME=jiaoxuedb_log,FILENAME='d:\jiaoxuedb_log.ldf') GO创建 jiaoxuedb 中的表: USE jiaoxuedb CREATE TABLE Student( Sno CHAR(10) NOT NULL, Sname CHAR(10) NOT NULL, Sex CHAR(2) NULL, Age TINYINT NULL, Dept CHAR(10) NULL) CREATE TABLE Teacher( Tno CHAR(10) NOT NULL, Tname CHAR(10) NOT NULL, Sex CHAR(2) NULL, Age TINYINT NULL, Prof CHAR(10) NULL, Sal SMALLINT NULL, Comm SMALLINT NULL, Dept CHAR(10) NULL) CREATE TABLE Course( Cno CHAR(10) NOT NULL, Cname CHAR(10) NOT NULL, Chour TINYINT NULL, Ccredit TINYINT NULL) CREATE TABLE SC( Sno CHAR(10) NOT NULL, Cno CHAR(10) NOT NULL, SCORE TINYINT NULL) CREATE TABLE TC( Tno CHAR(10) NOT NULL, Cno CHAR(10) NOT NULL)插入 jiaoxuedb 库中各表值: USE jiaoxuedb /*Insert values to Student Table*/ INSERT INTO Student VALUES('001101','宋大方','男',19,'计算机')-3-INSERT INTO Student VALUES('002102','李王','男',20,'信息') INSERT INTO Student VALUES('991101','张彬','男',18,'计算机') INSERT INTO Student VALUES('991102','王蕾','女',19,'计算机') INSERT INTO Student VALUES('991103','张建国','男',18,'计算机') INSERT INTO Student VALUES('991104','李平方','男',18,'计算机') INSERT INTO Student VALUES('991201','陈东辉','男',19,'计算机') INSERT INTO Student VALUES('991202','葛鹏','男',21,'计算机') INSERT INTO Student VALUES('991203','潘桃芝','女',19,'计算机') INSERT INTO Student VALUES('991204','姚一峰','男',18,'计算机') INSERT INTO Student VALUES('001102','许辉','女',22,'计算机') INSERT INTO Student VALUES('001201','王一山','男',20,'计算机') INSERT INTO Student VALUES('001202','牛莉','女',19,'计算机') INSERT INTO Student VALUES('002101','李丽丽','女',19,'信息') /*Insert values to Teacher Table*/ INSERT INTO Teacher VALUES('000006','许红霞','女',39,'讲师',1100,1200,'计算机') INSERT INTO Teacher VALUES('000007','许永军','男',57,'教授',2000,3000,'计算机') INSERT INTO Teacher VALUES('000008','李贵青','女',65,'教授',2000,3000,'计算机') INSERT INTO Teacher VALUES('000009','王一凡','女',43,'讲师',1200,1200,'计算机') INSERT INTO Teacher VALUES('000010','田峰','男',33,'助教',500,800,'信息') INSERT INTO Teacher VALUES('000001','李英','女',39,'副教授',1500,2000,'信息') INSERT INTO Teacher VALUES('000002','张雪','女',51,'教授',1900,3000,'信息') INSERT INTO Teacher VALUES('000003','张朋','男',30,'讲师',1000,1200,'计算机') INSERT INTO Teacher VALUES('000004','王平','女',28,'讲师',850,1200,'信息') INSERT INTO Teacher VALUES('000005','李力','男',47,'教授',1800,3000,'计算机') /*Insert values to Course Table*/ INSERT INTO Course VALUEs('01001','计算机基础',60,3) INSERT INTO Course VALUEs('01002','程序设计',80,5) INSERT INTO Course VALUEs('02003','数据结构',60,6) INSERT INTO Course VALUEs('02001','数据库',80,6) INSERT INTO Course VALUEs('02002','计算机网络',60,6) INSERT INTO Course VALUEs('01003','微机原理',60,8) INSERT INTO Course VALUEs('02004','操作系统',60,6) INSERT INTO Course VALUEs('03001','软件工程',60,3) INSERT INTO Course VALUEs('03002','大型数据库',48,2) INSERT INTO Course VALUEs('03003','图像处理',48,2) /*Insert values to SC Table*/ INSERT INTO SC VALUES('991101','01001',88) INSERT INTO SC VALUES('991102','01001',93) INSERT INTO SC VALUES('991103','01001',90) INSERT INTO SC VALUES('991101','01002',90) INSERT INTO SC VALUES('991102','01002',98)-4-INSERT INTO SC VALUES('991103','01002',74) INSERT INTO SC VALUES('991104','01002',85) INSERT INTO SC VALUES('001201','01002',64) INSERT INTO SC VALUES('991104','02001',33) INSERT INTO SC VALUES('991104','01001',35) INSERT INTO SC VALUES('991201','01001',76) /*Insert values to TC Table*/ INSERT INTO TC VALUES('000001','02001') INSERT INTO TC VALUES('000008','02002') INSERT INTO TC VALUES('000003','02001') INSERT INTO TC VALUES('000011','02003') INSERT INTO TC VALUES('000001','01001') INSERT INTO TC VALUES('000002','01002') INSERT INTO TC VALUES('000002','01003') INSERT INTO TC VALUES('000004','02002') INSERT INTO TC VALUES('000005','01001') INSERT INTO TC VALUES('000006','01002') INSERT INTO TC VALUES('000003','01003')实验 4:习题 基于 jiaoxuedb 实验 1、 对个表创建实体完整性; USE jiaoxuedb ALTER TABLE Student ADD CONSTRAINT PK_SNO PRIMARY KEY(Sno) ALTER TABLE Teacher ADD CONSTRAINT PK_TNO PRIMARY KEY(Tno) ALTER TABLE Course ADD CONSTRAINT PK_CNO PRIMARY KEY(Cno) ALTER TABLE Student ADD CONSTRAINT UNIQUE_S UNIQUE(Sno) ALTER TABLE Teacher ADD CONSTRAINT UNIQUE_T UNIQUE(Tno) ALTER TABLE Course ADD CONSTRAINT UNIQUE_C UNIQUE(Cno)-5-2、 创建表之间的参照完整性。
SQLServer物化视图学习笔记⼀、基本知识索引视图实际上是⼀种将⼀组唯⼀值“物化”为群集索引形式的视图(⽩话是,给视图中的唯⼀值列加聚集索引,然后数据会存储在硬盘中),提⾼查询速度。
通过使⽤来⾃第⼀个索引的聚集键作为参考点,SQL Server还能在视图上建⽴额外的索引。
其限制如下:1. 如果视图引⽤了任何⽤户⾃定义函数,那么这些函数也必须是模式绑定的;2. 视图不可以引⽤任何其他的视图-只能引⽤表和UDF;3. 在视图中引⽤的所有表和UDF必须采⽤两部分的命名约定(例如:dbo..Customers),并且也必须具有和视图相同的所有者;4. 视图和视图引⽤的所有对象必须在相同的数据库中;5. 在创建视图和所有底层表时,必须打开ANSI_NULLS以及QUOTED_IDENTIFIER选项;6. 视图引⽤的任何函数必须是确定的;7、必须要加上WITH SCHEMABINDING, 就是绑定到架构. 8、创建完视图后, 必须紧跟着创建⼀个CLUSTERED聚集唯⼀索引,⽽且必须在第⼀列(第⼀列是唯⼀值,类似于主键那样). 9、只⽀持两部分命名的表或UDF, 如 dbo.SalesOrder.10. 涉及到多个表连接时, 不⽀持left join 或right join的写法, 只能⽤from...where的⽅式或inner join的⽅式连接. (这⼀点有时很要命只能⽤inner join太蛋疼)11. 不⽀持table.*这种懒省事的⽅式, 得⼀个⼀个把想要的列写清楚.--创建模式绑定视图CREATE VIEW PersonAge_vwWITH SCHEMABINDINGASSELECT Age,COUNT_BIG(*) AS CountAge FROM dbo.PersonTenMillionGROUP BY Age--为视图创建索引CREATE UNIQUE CLUSTERED INDEX ivPersonAgeON PersonAge_vw(Age)SQL Server中的索引视图也具有查询重写的功能, 所谓的查询重写,就是如果符合条件的数据在索引视图上,并且查询列都包含在在索引视图上,此时可以直接通过查询索引视图来替代基于原始表的查询。
SQL SERVER2000教程第一章第一节简介SQL Server 2000是微软公司开发的采用SQL语言的关系型数据库管理系统,它拥有高弹性与多元化的结构,不仅符合业界的需要,更能与现今的互联网紧密集成,而对Windows CE/98/NT/2000/XP/2003等操作系统的全面支持的优越性得到最终程序开发人员的普遍认可。
SQL Server2000是服务器级的数据库管理系统,不论是客户机/服务器、多层结构,还是Database Web应用程序,SQL Server 2000都起着后端数据库的角色。
可以说,SQL Server 2000是所有数据的汇总与管理中心,是整个应用系统的枢纽。
第二节数据库分类逻辑数据库(1)系统数据库:系统数据库作为SQLSERVER默认安装的一部分而安装,由系统表和存储过程组成。
系统数据库、表以及存储过程共同为您提供了设计、创建、部署和维护世界级SQLSERVER数据库的工具和支持。
a)Master数据库:是追踪所有其它数据库和配置信息的关键数据库。
它控制着用户数据库和SQLSERVER的操作。
Master数据库对你的信息绝对重要,所以你应该总是保留Master数据库的最近备份。
b)Msdb数据库:是SQLSERVERAgent的主要支持。
SQLSERVERAgent负责复制、任务调度、警报、系统操作员信息以及备份信息。
因此,Msdb也是非常重要的,哪怕你不使用SQLSERVERAgent,在Msdb中的备份信息也有助于数据库的恢复。
c)Model数据库:是一个创建新数据库的模板,它包含了应该出现在每个用户数据库中的系统表。
在创建一个数据库时,SQLSERVER会把Model数据库的全部内容复制到新数据库中。
因此,如果你想每次创建数据库时自动地创建某些对象、权限和用户,你就可以把它们放在Model数据库中。
d)Tempdb数据库:保存所有临时表和临时存储过程。
临时表可以被程序员显示的创建。
PRIMARY KEY 约束
表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。
这样的一列或
通过它可强制表的实体完整性。
当创建或更改表时可通过定
一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。
由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
当为表指定 PRIMARY KEY 约束时,Microsoft® SQL Server™ 2000 通过为主键强制数据的唯一性。
当在查询中使用主键时,该索引还可用来对
如果 PRIMARY KEY 约束定义在不止一列上,则一列中的值可以重复,但 PRIMARY KEY 约束定义中的所有列的组合的值必须唯一。
如下图所示,titleauthor 表中的 au_id和title_id列组成该表的组合PRIMARY KEY 约束,以确保au_id和title_id的组合唯一。
当进行联接时,PRIMARY KEY 约束将一个表与另一个表相联。
例如,若要确定作者与书名的对应关系,可以使用authors表、titles表和titleauthor表的三向联接。
因为titleauthor包含au_id和title_id两列,对titles表的访问可由titleauthor和titles 之间的关联进行。
创建聚集索引
在Microsoft® SQL Server™ 数据库中可以创建聚集索引。
在聚集索引中,表中各行的物理顺序与索引键值的逻辑(索引)顺序相同。
表只能包含一个聚集索引。
聚集索引通常可加快 UPDATE 和 DELETE 操作的速度,因为这两个操作需要读取
大量的数据。
创建或修改聚集索引可能要花很长时间,因为执行这两个操作时要在磁盘上对表的行进行重组。
可考虑将聚集索引用于:
∙包含数量有限的唯一值的列,如 state 列只包含 50 个唯一的州代码。
∙使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。
∙返回大结果集的查询。
聚集索引也叫簇索引。
在文件组上放置索引
默认情况下,索引创建在基表所在的文件组上,该索引即在该基表上创建。
不过,可以在不同于包含基表的文件组的其它文件组上创建非聚集索引。
通过在其它文件组上创建索引,可以在文件组通过自带的控制器使用不同的物理驱动器时实现性能提升。
这样一来,数据和索引信息即可由多个磁头并行读取。
例如,如果文
件组f1 上的Table_A和文件组f2 上的Index_A都由同一个查询使用,就可无争夺地充分利用这两个文件组,因此可以实现性能提升。
但是,如果Table_A 由查询扫描而没有引用Index_A,则只利用文件组f1,因而未实现性能提升。
然而,由于不能预测将要发生的访问类型以及访问时间,因此更安全的决策可能是将表和索引在所有文件组中展开。
这将保证能够访问所有磁盘,因为所有数据和索引在所有磁盘上均匀展开,不受访问数据的方式的限制。
这对系统管理员来说也是更简单的方法。
如果表上有聚集索引,数据和该聚集索引将始终驻留在相同的文件组内。
因此,可以在基表上创建一个聚集索引,指定另外一个文件组,在该文件组上新建索引(然后可以除去该索引,而只在新文件组内保留基表),从而将表从一个文件组移动到另一个文件组。
如果表的索引跨越多个文件组,则必须将所有包含该表及其索引的文件组一起备份,之后还必须创建事务日志备份。
否则,只能备份索引的一部分,导致还原备份时无法恢复索引。
有关更多信息,请参见使用文件备份。
说明单个表或索引只能属于一个文件组,而不能跨越多个文件组。
UNIQUE 约束
可使用 UNIQUE 约束确保在非主键列中不输入重复值。
尽管 UNIQUE 约束和PRIMARY KEY约束都强制唯一性,但在强制下面的唯一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束:
∙非主键的一列或列组合。
一个表可以定义多个 UNIQUE 约束,而只能定义一个 PRIMARY KEY 约束。
∙允许空值的列。
允许空值的列上可以定义 UNIQUE 约束,而不能定义 PRIMARY KEY 约束。
FOREIGN KEY 约束也可引用 UNIQUE 约束。
FOREIGN KEY 约束
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。
通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。
这个列就成为第二个表的外键。
当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。
例如,数据库pubs中的titles 表与publishers表有链接,因为在书名和出版商之间存在逻辑联系。
titles表中的pub_id列与publishers 表中的主键列相对应。
titles表中的pub_id列是到publishers表的外键。
FOREIGN KEY 约束并不仅仅只可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。
FOREIGN KEY 约束不允许空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过 FOREIGN KEY 约束的校验。
说明 FOREIGN KEY 约束可引用同一数据库中的表或同一表(自引用表)内的列,例如,
一个包含下面三列的雇员表:employee_number、employee_name和manager_ employee_number。
由于经理本身也是雇员,所以从manager_employee_number 列到employee_number 列存在外键关系。
尽管 FOREIGN KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。
例如,如果在publishers表中删除一个出版商,而这个出版商的 ID 在titles表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles表中该出版商的书籍因为与publishers 表中的数据没有链接而变得孤立了。
FOREIGN KEY 约束防止这种情况的发生。
如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。
如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。
若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
级联删除相关的字段
无论何时删除主表的被引用行,都指示 DBMS 自动删除外键表的行。