-
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表的外键。(id int primary key,
name varchar(30)
)
create table Classes
(
id int primary key,
monitor int
constraint fk_stu
foreign key references students(id)
)
然后分别向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表必须用一个新的班长来替换她。insert into students values('20050101','王强')
insert into students values('20050102','牛好')
insert into students values('20050103','付志明')
//向classes表里插入一条数据
insert into classes values('05','20050103')
这两个表是一个父-子关系的典型例子。可以认为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”协定。当然在同一个列上对删除和更新使用不同的协定是不可能的,但在上面这种情况下则是可能的。下面将结合上面这个具体实例来说明在每一种情况下如何工作。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')
如果students表了被monitor列引用的行,则monitor列的值将用NULL来代替。例如将students表中的id号为20050103的学生删除,可以使用如下语句:
delete from students
where ID='20050103'
select * from students
select * from classes
执行上述语句后,可以看到classes表的显示信息如图6-18所示。图6-17为两表原始数据。where ID='20050103'
select * from students
select * from classes
图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列已被修改成了0set name='林强', id='20050106'
where ID='20050103'
图6-19 更新students
对于处理外键更改的情况ON DELETE和ON UPDATE子句能很容易地指定使用”replace with NULL”或“replace with well_know value”协定。当然,这里也许会出现一些警告,例如这些子句不允许违反任何约束等各种情况。
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式