2008从入门到精通

1.锁

当四个用户同期对同多少个数额实行修改时会发生并发难题,使用专业就足以缓和那个难题。但是为了防止别的用户修改另一个还没实现的思想政治工作中的数据,就须要在作业中用到锁。
SQL Server
二零零六提供了二种锁格局:排他锁,分享锁,更新锁,意向锁,键范围锁,架构锁和大体积更新锁。
查询sys.dm_tran_locks视图能够便捷理解SQL Server 二〇〇九内的加锁景况。

SELECT * FROM sys.dm_tran_locks;

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

目录

约束

XML查询本领

XML文书档案以二个纯文本的方式存在,首要用来数据存款和储蓄。不但实惠用户读取和采纳,何况使修改和珍惜变得更易于。

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

  • 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)

用来内定表中的一列或几列组合的值在表中具有独一性。建立主键的指标是让外键来援引。

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数据类型的行使限制
唯有ST本田CR-VING数据类型才干调换到XML。
XML列不能够采纳于GROUP BY语句中
XML数据类型存款和储蓄的多寡不能够高出2GB
XML数据类型字段不能被设置成主键只怕外键或称为其一部分。
Sql_variant数据类型字段的选择无法把XML数据类型作为种子品种。
XML列无法内定为独一的。
COLLATE子句无法被使用在XML列上。
仓库储存在数据库中的XML仅扶助128级的层系。
表中最对只好具备三十个XML列。
XML列不可能参预到法规中。
独一可采取于XML列的嵌入标量函数是ISNULL和COALESCE。
有着XML数据类型列的表不可能有八个抢先15列的主键。

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语句不在同二个批管理中照旧能够成功执行。

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)
);

2008从入门到精通。对t_id列成立主键,约束名称叫t_idss。

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

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

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中学央市直机关接表明了二个游标并赋值,而语句第22中学声称了游标类型的变量@stu_cursor,然后给该变量赋值。这两侧是区别的。

1.1.DDL触发器

当服务器或数据库中爆发多少定义语言(DDL)事件时将被调用。如CREATE,ALTERDROP等操作。纵然要实行以下操作,能够应用DDL触发器:

  • 防御对数据库架构举办改换
  • 可望数据库中发出一些情形以响应数据库架构中的改换
  • 要记录数据库框架结构中的改换或事件
删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

自律名与列名不一样,此处填写约束名

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数据类型,公共语言运行时(CLRAV4)用户定义类型,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

2.3.游标参数FO科雷傲WAOdysseyD_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

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);

XQuery简介

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

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

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;

FOR XML子句

透过在SELECT语句中利用FO奇骏XML子句可以把数据库表中的数据检索出来并生成XML格式。SQL Server
2010支撑FO奥迪Q5XML的八种方式,分别是RAW形式,AUTO方式,EXPLICIT格局和PATH格局。

3.存款和储蓄进度

存款和储蓄进程是一组用于完毕一定功效的语句集,经过编写翻译后存储在数据库中。在SQL
Server 二〇〇八中,不仅可以够用T-SQL编写存款和储蓄进程,也能够用CL812 Superfast编写存款和储蓄进程。

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)
);
FOR XML RAW

将表转变到成分名称是row,属性名叫列名大概列的小名。
示例9:将Student表转变为XML格式(FO科雷傲 XML RAW)
Student表的数据如图所示
图片 12
进行语句:

SELECT * FROM Student FOR XML RAW;

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

3.1.用户定义的仓库储存进程

该种存款和储蓄进程是指封装了可采用代码的模块可能经过,有2种类型:T-SQL存款和储蓄进度和CLWrangler存款和储蓄进程。
T-SQL存储进程是指保存的T-SQL语句集结
CLLacrosse存款和储蓄进程是指对Microsoft .NET Framework公共语言运营时(CL奥迪Q5)方法的引用

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表中的数据如图所示
图片 15
游标示例2:对student表中还未分班的学习者张开分班
Student表中的数据如图所示
图片 16
其中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表的数额
图片 17
Class_student表的多寡
图片 18
至此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
图片 19
实践存款和储蓄过程

EXEC dbo.student_division

结果如图所示
Student表的多少(分班状态都为true了)
图片 20
Class_student表的数据
图片 21

外关键字约束(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走,无法反着来。

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

FOR XML AUTO

行使表名称作为成分名称,使用列名称作为质量名称,SELECT关键字前边列的逐一用于XML文书档案的层系。
示例10:将Student表转变为XML格式(FOTiguan XML AUTO)
实践语句:

SELECT * FROM Student FOR XML AUTO;

询问结果如图所示
图片 22
图片 23

admin

网站地图xml地图