mg4377娱乐娱城官网_mg4377娱乐手机版_www.mg4377.com

当前位置: mg4377娱乐娱城官网 > mg > 正文

二零零六从入门到领会

时间:2019-10-06 05:34来源:mg
XML查询技艺 XML文书档案以一个纯文本的款型存在,首要用于数据存款和储蓄。不但方便客户读取和动用,何况使修改和维护变得更便于。 目录 约束 1.锁 当三个客户同期对同一个多少进

XML查询技艺

XML文书档案以一个纯文本的款型存在,首要用于数据存款和储蓄。不但方便客户读取和动用,何况使修改和维护变得更便于。

目录

约束

1.锁

当三个客户同期对同一个多少进行修改时会发生并发难题,使用专门的学业就足以减轻那一个主题素材。可是为了防止别的用户修改另三个还没达成的事体中的数据,就需求在工作中用到锁。
SQL Server 二零零六提供了多种锁格局:排他锁,分享锁,更新锁,意向锁,键范围锁,架构锁和大容积更新锁。
查询sys.dm_tran_locks视图能够高速了然SQL Server 二〇一〇内的加锁意况。

SELECT * FROM sys.dm_tran_locks;

注:关于锁的知识书中没细讲,就要以后的博客中补充。

XML数据类型

XML是SQL Server中放置的数据类型,可用来SQL语句也许当做存款和储蓄进程的参数。客户可以从来在数据库中存款和储蓄、查询和管制XML文件。XML数据类型还是能够保留整个XML文书档案。XML数据类型和任何数据类型不设有根本上的出入,能够把它用在别的平时SQL数据类型能够应用的地方。
示例1:创设贰个XML变量并用XML填充

DECLARE @doc XML
SELECT @doc='<Team name="Braves" />';

示例2:创造XML数据类型列

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column1));

在地点的事必躬亲中,column2列是XML数据类型列。
示例3:不可能将XML数据类型列设置为主键或外键

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column2));

实践上边的代码,报错如下:
消息1919,级别16,状态1,第1 行
表't1' 中的列'column2' 的品类无法用作索引中的键列。
消息1750,级别16,状态0,第1 行
没辙创建约束。请参阅前边的不当音信。
XML数据类型的选用范围
独有STLX570ING数据类型技巧转变到XML。
XML列不能够应用于GROUP BY语句中
XML数据类型存款和储蓄的多少不能抢先2GB
XML数据类型字段无法被设置成主键恐怕外键或称为其一部分。
Sql_variant数据类型字段的选择无法把XML数据类型作为种子项目。
XML列不可能钦赐为独一的。
COLLATE子句不可能被应用在XML列上。
存款和储蓄在数据库中的XML仅援助128级的档期的顺序。
表中最对只好具有三拾二个XML列。
XML列不能够加盟到准绳中。
独一可利用于XML列的放权标量函数是ISNULL和COALESCE。
全数XML数据类型列的表不可能有八个超出15列的主键。

  • 1.触发器
    • 1.1.DDL触发器
    • 1.2.DML触发器
    • 二零零六从入门到领会。1.3.创立触发器
      • 1.3.1.创建DML触发器
      • 1.3.2.创建DDL触发器
      • 1.3.3.嵌套触发器
      • 1.3.4.递归触发器
    • 1.4.管理触发器
主关键字约束(Primary Key Constraint)

用来钦赐表中的一列或几列组合的值在表中全部唯一性。组建主键的目标是让外键来引用。

2.游标

游标是周边于C语言指针同样的结构,是一种多少访问机制,允许客户访问单独的数据行。游标主要由游标结果集和游标地点组成。游标结果集是概念游标的SELECT语句再次来到行的聚众,游标地点是指向这些结果聚集某一行的指针。
示例1:用游标检索出student表中每行记录
Student表记录如图所示
图片 1
实施下列语句

USE test
DECLARE stu_cursor CURSOR FOR
SELECT * FROM student--声明student表的游标stu
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor--移动该记录指针
WHILE @@FETCH_STATUS=0--@@FETCH_STATUS用于保存FETCH操作的结束信息,=0表示有记录检索成功
BEGIN
FETCH NEXT FROM stu_cursor--游标指针移动到下一条记录
END
CLOSE stu_cursor--关闭游标
DEALLOCATE stu_cursor--释放游标资源

结果如图所示
图片 2

类型化的XML和非类型化的XML

能够创制xml类型的变量,参数和列,可能将XML架构集结和xml类型的变量、参数或列关联,这种景况下,xml数据类型实例称之为类型化xml实例。不然XML实例称为非类型化的实例。

1.触发器

触发器是一种奇特的存款和储蓄进程,与表紧凑关联。

Primary Key的始建立模型式

在创造表时创造Primary Key

CREATE TABLE table1(
    t_id VARCHAR(12) ,
    t_name VARCHAR(20),
    t_phone VARCHAR(20),
    CONSTRAINT t_idss PRIMARY KEY(t_id)
);

对t_id列创建主键,约束名叫t_idss。

2.1.游标定义的参数LOCAL和GLOBAL

游标定义参数LOCAL表示该游标只可以功效于此番批管理或函数或存款和储蓄进程。游标定义参数GLOBAL表示该游标能够成效于大局。
实践下列语句

DECLARE stu_cursor CURSOR LOCAL
FOR SELECT * FROM student
GO
OPEN stu_cursor
GO

实施结果如下
图片 3
语句中,注脚了一个student表的游标stu_cursor,在开垦游标时提示游标不设有。因为该游标参数是LOCAL,只好功效于当下批管理语句中,而展开游标语句和申明语句不在一个批管理中。假设去掉第一个GO,使几个语句在同叁个批管理中,就会弹无虚发举办不会报错。
试行下列语句

DECLARE stu_cursor1 CURSOR GLOBAL
FOR SELECT * FROM student
GO
OPEN stu_cursor1
GO

进行结果:命令已成功做到
和LOCAL参数比较,GOLBAL参数设置游标效能于大局,因而OPEN和DECLARE语句不在同叁个批管理中依旧能够成功施行。

XML数据类型方法

XML数据类型共有5种办法
query():执行一个XML查询并重回查询结果(再次回到二个XML数据类型)。
示例4

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SELECT @xmlDoc.query('/students/class/student') AS test
--用query()查询@xmlDoc变量实例中标签<student>的子元素

查询结果如图所示
图片 4
点击查询结果
图片 5
如想询问标签

DECLARE @addr XML--声明一个XML类型变量@addr
SET @addr='/students/class/student'
SELECT @addr.exist('/students/class="江苏"') AS 返回值

结果如图所示
图片 6

注:exsit()方法的参数不必做正明显位

Value():计算贰个查询并从XML中回到八个粗略的值(只好回到单个值,且该值为非XML数据类型)。
Value()方法有2个参数XQuery和SQLType,XQuery参数表示命令要从XML实例之中查询数据的具体地点,SQLType参数表示value()方法重回的值的首推数据类型。
示例6

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
DECLARE @classID INT--声明INT类型的变量@classID
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SET @classID=@xmlDoc.value('(/students/class/@NO)[1]','INT')
--将value()方法返回值赋值给变量@classID
SELECT @classID AS classID

查询结果如图所示
图片 7

注:SQLType不能是XML数据类型,公共语言运维时(CLENVISION)顾客定义类型,image,text,ntext或sql_variant数据类型,但能够是客户自定义数据类型SQL。

Modify():在XML文书档案的合适地方实行二个改变操作。它的参数XML_DML代表一串字符串,依据此字符串表明式来更新XML文书档案的从头到尾的经过。
示例7:在@xmlDoc的实例中,成分

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'
SELECT @xmlDoc AS '插入节点前信息'
SET @xmlDoc.modify('insert <学历>本科</学历> after (students/class/student/age)[1]')
SELECT @xmlDoc AS '插入节点后信息'

查询结果插入节点后新闻如图所示
图片 8

注:modify()方法的参数中insert和另外重点字必得小写,不然会报错

Nodes():允许把XML分解到贰个表结构中。此措施将XML数据类型实例拆分为关周详据,并赶回包罗原始XML数据的行集。
示例8:依然用@locat参数的实例来演示

DECLARE @locat XML--声明XML变量@locat
SET @locat=
'<root>
    <location locationID="8">
        <step>8的步骤</step>
        <step>8的步骤</step>
        <step>8的步骤</step>
    </location>
    <location locationID="9">
        <step>9的步骤</step>
        <step>9的步骤</step>
        <step>9的步骤</step>
    </location>
    <location locationID="10">
        <step>10的步骤</step>
        <step>10的步骤</step>
        <step>10的步骤</step>
    </location>
    <location locationID="11">
        <step>11的步骤</step>
        <step>11的步骤</step>
        <step>11的步骤</step>
    </location>
</root>'--@locat变量的实例

SELECT T.Loc.query('.') AS result
FROM @locat.nodes('/root/location') T(Loc)
GO

查询结果如下图所示
图片 9

1.1.DDL触发器

当服务器或数据库中生出多少定义语言(DDL)事件时将被调用。如CREATE,ALTERDROP等操作。假设要施行以下操作,能够使用DDL触发器:

  • 防护对数据库架构实行转移
  • 可望数据库中发生一些意况以响应数据库架构中的更动
  • 要记录数据库架构中的改动或事件
删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

封锁名与列名分化样,此处填写约束名

2.2.游标分为游标变量和游标类型

正如列语句

--语句1
DECLARE stu_cursor CURSOR
FOR SELECT * FROM student--声明student表的游标名称为stu_cursor并赋值
GO

--语句2
DECLARE @stu_cursor CURSOR--声明游标类型的变量@stu_cursor
SET @stu_cursor=CURSOR FOR--给该变量赋值
SELECT * FROM student

在语句第11中学一直申明了三个游标并赋值,而语句2中表明了游标类型的变量@stu_cursor,然后给该变量赋值。这二者是分化的。

XQuery简介

XQuery是一种查询语言,能够查询结构化只怕半结构化的数据。SQL Server 二〇〇九中对XML数据类型提供了支撑,能够存款和储蓄XML文书档案,然后选拔XQuery语言举行查询。

1.2.DML触发器

当数据库服务器中生出多少操作语言(DML)事件时将被调用。如INSERT,DELETE,UPDATE等操作。将DML触发器和触发语句作为可在触发器内回滚的单个事务对待,假若检查评定到不当,则全体业务回滚。DML触发器在须臾间方面非常实用:

  • 可达成数据库相关表之间的级联改变
  • 可防止卫恶意或不当的DML讲话事件,并强制实行比CHECK封锁越来越复杂的别的限制
  • 能够评估数据修改前后表的境况,并依赖该距离选择措施

二个表中的四个同类DML触发器,允许用四个不等的操作来响应同贰个退换语句
SQL Server 2008为各种触发器创设了2个特别的表:INSERTED表和DELETED表。那是七个逻辑表,由系统来创建和保卫安全,客户不能够对她们开展退换。它们寄存在内部存款和储蓄器中,并不是在数据库中,何况组织与被DML触发器功能的表的布局一样。
INSERTED表中存放了由施行INSERTUPDATE语句而插入的具备行,在进行INSERTUPDATE话语时,新的就要同一时间被插入到触发器作用的表和INSERTED表中。INSERTED表中的行是触发器成效的表中央银行的别本。
DELETED表中寄放了由进行DELETEUPDATE语句而删除的装有行,在实行DELETEUPDATE言辞时,被去除的将在由触发器成效的表中被移位到DELETED表,五个表中不会有重复行。

向已有表中加多Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);

2.3.游标参数FOSportageWAEvoqueD_ONLY和SCROLL

FORWARD_ONLY参数设置游标只可以从结果集的始发向甘休方向读取,使用FETCH语句时只可以用NEXT,而SCROLL参数设置游标能够从结果集的即兴方向,放肆地方移动。如下列语句

--语句1,默认FORWARD_ONLY
DECLARE stu_cursor CURSOR LOCAL
FOR SELECT * FROM student
OPEN stu_cursor
FETCH NEXT FROM stu_cursor
GO
--语句2,FORWARD_ONLY参数,FETCH时只能从开始往结束方向
DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
FOR SELECT * FROM student
OPEN stu_cursor 
FETCH NEXT FROM stu_cursor
GO
--语句3,SCROLL参数,FETCH时可以从任意位置往任意方向
DECLARE stu_cursor CURSOR SCROLL LOCAL
FOR SELECT * FROM student
OPEN stu_cursor
FETCH LAST FROM stu_cursor
GO

FOR XML子句

透过在SELECT语句中动用FO猎豹CS6XML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server 二〇一〇支撑FOLANDXML的多样方式,分别是RAW形式,AUTO格局,EXPLICIT情势和PATH情势。

1.3.成立触发器

累加Primary Key的另一种示例
ALTER TABLE Products
ADD PRIMARY KEY(prod_id);

即便上述代码运营没难题,查看表格设计也能够看见Primary Key设置成功,可是在剔除Primary Key操作时会提示:
消息3728,级别16,状态1,第1 行
'prod_id' 不是束缚。
消息3727,级别16,状态0,第1 行
决不能删除约束。请参阅后边的错误音讯。
由来是加上Primary Key语句中绝非用CONSTRAINT指明约束名,系统自动生成了主键名和平协议束名,要先查看主键名和平左券束名,删除时填写的也是约束名。
这种景况的正确性删除方法

ALTER TABLE Products
DROP CONSTRAINT CK__Products__prod_p__1A14E395;
ALTER TABLE Products
DROP CONSTRAINT PK__Products__56958AB222AA2996;

2.4.游标的粗略利用

示例2:将student表中stu_enter_score大于600分的学员都减去100分
Student表中的数据如图所示
图片 10
试行下列语句

--游标的简单应用
DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
FOR SELECT stu_no,stu_enter_score FROM student
OPEN stu_cursor
DECLARE @score INT
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
WHILE @@FETCH_STATUS=0 
BEGIN
IF @score>=600
BEGIN
UPDATE student
SET stu_enter_score=@score-100 WHERE stu_no=@stu_no 
END
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
END
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
图片 11

FOR XML RAW

将表转变来成分名称是row,属性名称叫列名可能列的外号。
示例9:将Student表转换为XML格式(FOEvoque XML RAW)
Student表的数目如图所示
图片 12
试行语句:

SELECT * FROM Student FOR XML RAW;

询问结果如图所示
图片 13
图片 14

1.3.1.创建DML触发器

多列组合增多主键约束
CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT ts_id PRIMARY KEY(t_id,s_id)
);

3.仓库储存进程

储存进度是一组用于达成一定功能的语句集,经过编写翻译后存储在数据库中。在SQL Server 二零一零中,既可以够用T-SQL编写存款和储蓄进程,也足以用CL福睿斯编写存款和储蓄进程。

FOR XML AUTO

运用表名称作为成分名称,使用列名称作为品质名称,SELECT关键字前边列的种种用于XML文书档案的档次。
示例10:将Student表调换为XML格式(FOPRADO XML AUTO)
实践语句:

SELECT * FROM Student FOR XML AUTO;

查询结果如图所示
图片 15
图片 16

1.3.1.1.INSERT触发器

示例1:创立贰个触发器Automatic_division,当在Student表中插入一条学生音信时,触发器依据入学分数(stu_enter_score)对学生开展机动分班,并在class_student表中插入一条记下。
分班必要:
|Stu_enter_score |Class_id |Class_name|
|-------------------|------------------|--------------|
|stu_enter_score>=700| 01| 创新A班|
|650<=Stu_enter_score<700| 02| 重点B班|
|600<=Stu_enter_score<650| 03| 提高C班|
|550<=Stu_enter_score<600| 04| 普通D班|
|500<=Stu_enter_score<550| 05| 普通E班|
|Stu_enter_score<500| 06| 普通F班|
施行下列语句

CREATE TRIGGER automatic_division
ON student--新建一个检测student表的触发器,命名automatic_division
FOR INSERT--检测到INSERT操作时触发器工作
AS
DECLARE @score INT,@stu_no VARCHAR(8),@class_id CHAR(2)
--声明三个变量
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY--声明一个指向inserted表的局部游标stu_cursor
FOR SELECT stu_no,stu_enter_score FROM inserted
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标指向inserted表的第一个数据并把游标指向的stu_no和stu_enter_score值分别赋值给@stu_no和@score
WHILE @@FETCH_STATUS=0--开始循环
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
--判断结束
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor--关闭游标
DEALLOCATE stu_cursor--释放游标资源
GO

说西魏码是还是不是正确
student表中插入数据,并查阅class_student表中的数据是或不是正确

INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score)
VALUES('20180001','邹莉莉','女','389'),
('20180002','万兴','男','701'),
('20180003','孙伟','男','652'),
('20180004','温佳静','女','676'),
('20180005','姜立夫','男','542')

Class_student表中的数据如图所示
图片 17
游标示例2:对student表中还未分班的学员开展分班
Student表中的数据如图所示
图片 18
其中stu_no20180001~20180005的学员早就在示例1中分班,剩下的学习者全都未分班。
试行下列语句

ALTER TABLE student
ADD stu_division_state bit--为student表新建一列记录是否已分班,true表示已分班
GO
DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中
GO
DECLARE @stu_no VARCHAR(8),@score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state IS NULL
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
Student表的数目
图片 19
Class_student表的数码
图片 20
至此Student表中享有学生皆是分班
为了今后有帮衬,能够将游标示例2中的代码稍作修改封装成三个客商自定义存款和储蓄进程
储存进度示例3
修改后的代码如下

CREATE PROCEDURE student_division
AS
BEGIN
UPDATE student
SET stu_division_state=0--先将student表中所有学生的分班情况都标成未分班

DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no--利用游标找出student表中已分班的学生并标记分班状态
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中

DECLARE @score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state=0
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
END
GO

注:和游标示例2的代码相比,示例3的代码加多了将持有学员分班状态标识为0的历程,去掉了充裕stu_division_state列的经过,但对原本已部分学员的分班状态赋值那一个手续未有删去,而是进行双重校验。并且删除了两段代码中的GO和第二段用于给学生疏班的代码中对@stu_no变量的再一次申明。

student表插入数据并运维student_division的存放进度

注:对student表插入数据前应先禁止使用示例1的触发器automatic_division

施行下列语句

ALTER TABLE student DISABLE TRIGGER automatic_division
--禁用automatic_division触发器
INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score,stu_division_state)
VALUES('20180006','王洋','男','724',NULL),
('20180007','易阳','男','713',NULL),
('20180008','孙浩','男','584',NULL),
('20180009','张秋燕','女','420','False'),
('20180010','胡燕','女','527','True')

Student表的数目如图所示,红框内正是本人正好插入还未分班的数码,个中2018000920180010那多个学生的分班状态被作者误标成FalseTrue
图片 21
进行存款和储蓄进程

EXEC dbo.student_division

结果如图所示
Student表的数额(分班状态都为true了)
图片 22
Class_student表的多寡
图片 23

外关键字约束(Foreign Key Constraint)

概念了表之间的涉嫌,用来维护八个表之间的一致性的涉及。
在开立表时成立Foreign Key Constraint

CREATE TABLE table2(
    s_id VARCHAR(20),
    s_name VARCHAR(12),
    s_tellphone VARCHAR(11),
    s_address VARCHAR(20),
    CONSTRAINT PK_s_id PRIMARY KEY(s_id),
);--首先新建table2,设置s_id为主键

CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT pk_ts_id PRIMARY KEY(t_id,s_id),--新建table1,对t_id和s_id设置联合主键,键名pk_ts_id
    CONSTRAINT fk_s_id FOREIGN KEY(s_id)--对s_id设置外键fk_s_id
    REFERENCES table2(s_id)--外键fk_s_id外键关联table2的列s_id
    ON DELETE CASCADE--设置在table1的s_id删除时table2的s_id同时删除
    ON UPDATE CASCADE--设置在table1的s_id更新时table2的s_id同时更新
);

注:对table1设置外键关联table2,在插入数据时须求先插入table2的多少,才干学有所成插入table1的多少。改换table2.s_id数据,table1.s_id数据也会自动改变。可是改变table1.s_id数据,推行时报外键冲突。综上说述对table1设置外键关联table2后,table1的多寡跟着table2走,不能反着来。

增加和删除却键约束同主键。

3.1.客户定义的囤积进度

该种存款和储蓄进度是指封装了可选择代码的模块或然经过,有2种类型:T-SQL存款和储蓄进度和CL兰德本田CR-V存款和储蓄进度。
T-SQL存储进度是指保存的T-SQL语句集结
CL奥德赛存款和储蓄进度是指对Microsoft .NET Framework公共语言运维时(CL中华V)方法的援用

编辑:mg 本文来源:二零零六从入门到领会

关键词: