VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > T-SQL >
  • sql语句大全之新增语句ON DELETE和ON UPDATE

新增语句

修改数据,除了上面讲述的基本的INSERT,DELETE和UPDATE语句外,SQL 2008还提供了一些新增语句。如ON OUTPUT,ON DELETE以及OUTPUT。下面将要分别对这几个新增语句进行分别具体介绍。

6.4.1  ON DELETE和ON UPDATEsql语句大全

CREATE TABLE 表达式中的ON DELETE和ON UPDATE子句是另一种管理带有外键的列的方式。下面结合具体示例来介绍这两个新增语句的用法。
首先,创建一个Students表和一个Class表,这两个表分别包括两列,如下列表定义所示:
create table students
(id int primary key,
name varchar(30)
)
create table Classes
(
id int primary key,
monitor int
constraint fk_stu
foreign key references students(id)
)
这两个表主要分别用来显示一个班级的班长和学生。Classes表有一列名monitor,为了确保monitor是一名学生,这里有一个引用了Students表的外键。
然后分别向students和Classes这两个表里插入一些数据,如下所示:
//向students表插入三条数据
insert into students values('20050101','王强')
insert into students values('20050102','牛好')
insert into students values('20050103','付志明')
//向classes表里插入一条数据
insert into classes values('05','20050103')
一个简单的查询将显示‘付志明’是05班级的班长,如果需要更换班长,必须从classes表中删除他,但是在因一个新的班长而更新classes表或者从classes表中删除class自身之前,这个操作是不能执行的。在这种情况下,删除班级并不是一个可选项,classes表必须用一个新的班长来替换她。
这两个表是一个父-子关系的典型例子。可以认为students表是作为父表的存储,而classes表是作为子表的存储。通常情况下,改变一个父表可能需要更改其所有的子表。
如果“付志明”不再担任班长,并且没有为该班选择新的班长,这时可以使用两个协定:一个是用NULL代替该班的班长,另一个是用一个来自student表的id来代替班长。如果不希望在数据库中处理NULL值,则可以选择后一种协定。
ON DELETE子句可以附加在表的列定义中,以指定表中被引用的相应行,删除时使用那种协定。当然,被引用的表更新时,会出现同样的问题,可以使用相同的协定。ON UPDATE子句也可以附加在列定义上,用来指定在这种情况下使用哪种协定。
下面使用ON DELETE和ON UPDATE子句来重新定义classes表,如下所示。
//首先向students表中再插入一条语句
insert into students values('0','no monitor')
create table Classes
(
id int primary key,
monitor int
constraint fk_stu
foreign key references students(id)
on delete set null
on update set default
)
//向classes表中插入一条数据
insert into classes values('05','20050103')
在删除monitor引用的行时,可以使用“replace with null”协定。当然在同一个列上对删除和更新使用不同的协定是不可能的,但在上面这种情况下则是可能的。下面将结合上面这个具体实例来说明在每一种情况下如何工作。
如果students表了被monitor列引用的行,则monitor列的值将用NULL来代替。例如将students表中的id号为20050103的学生删除,可以使用如下语句:
delete from students
where ID='20050103'
select * from students
select * from classes
执行上述语句后,可以看到classes表的显示信息如图6-18所示。图6-17为两表原始数据。

图6-17  两表原始数据

图6-18  删除后两表数据
如果students表更新了被monitor列引用的行,并且它的id也被修改了,则monitor列的值将由该列的默认值替代,这里的默认值0,当然,默认值也可以设置为其他的学生的id。例如,现在需要把students表中的id号为20050103的学生的id修改为20050105,同时也可以将其name更改为“林强”。这时可以使用如下语句:
update students
set name='林强', id='20050106'
where ID='20050103'
执行上述语句后,两表显示结果如图6-19所示。Monitor列已被修改成了0

图6-19  更新students
对于处理外键更改的情况ON DELETE和ON UPDATE子句能很容易地指定使用”replace with NULL”或“replace with well_know value”协定。当然,这里也许会出现一些警告,例如这些子句不允许违反任何约束等各种情况。

相关教程