我有三个表:
第一个表(XMMC):
XMMC_ID XMMC XMMC_BH
1 我 1
2 你 2
3 他 3
第二个表(YJZB):
YJZB_ID YJZB YJZB_FBH YJZB_SBH
1 我我0 1 11
2 我我1 1 12
3 我我2 1 13
4 你你0 2 21
5 你你1 2 22
6 你你2 2 23
第三个表(EJZB);
EJZB_ID EJZB EJZB_FBH
1 我我我我1 11
2 我我我我2 11
3 我我我我3 11
4 我我我我4 12
5 我我我我5 12
6 我我我我6 12
7 我我我我7 13
8 我我我我8 13
9 我我我我9 13当我要删除XMMC_ID=1时(此时XMMC_BH=1),根据XMMC_BH=1删除YJZB表中的YJZB_FBH=XMMC_BH,和EJZB表中的相联记录.
(YJZB表是XMMC表的从表,EJZB表是YJZB表的从表)都是一对多的关系,怎么写SQL语句??
谢谢
第一个表(XMMC):
XMMC_ID XMMC XMMC_BH
1 我 1
2 你 2
3 他 3
第二个表(YJZB):
YJZB_ID YJZB YJZB_FBH YJZB_SBH
1 我我0 1 11
2 我我1 1 12
3 我我2 1 13
4 你你0 2 21
5 你你1 2 22
6 你你2 2 23
第三个表(EJZB);
EJZB_ID EJZB EJZB_FBH
1 我我我我1 11
2 我我我我2 11
3 我我我我3 11
4 我我我我4 12
5 我我我我5 12
6 我我我我6 12
7 我我我我7 13
8 我我我我8 13
9 我我我我9 13当我要删除XMMC_ID=1时(此时XMMC_BH=1),根据XMMC_BH=1删除YJZB表中的YJZB_FBH=XMMC_BH,和EJZB表中的相联记录.
(YJZB表是XMMC表的从表,EJZB表是YJZB表的从表)都是一对多的关系,怎么写SQL语句??
谢谢
级联更新也就是主表的更新、删除等都会对外表产生相应的更新、删除
级联更新相关数据字段
在外键定义的时候加 ON UPDATE CASCADE
指定如果试图更新某行中的键值,而该行的键值由其它表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。例:create table dep( --部门表
id int not null CONSTRAINT PK_dep_id PRIMARY KEY NONCLUSTERED,
name varchar(50)
)
gocreate table employee( --员工表
id int not null CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED,
name varchar(50),
depid int not null,
CONSTRAINT FK_employee_dep FOREIGN KEY (depid)
REFERENCES dep (id) ON UPDATE CASCADE
)
goinsert dep select 2,'销售部'
union all select 3,'人事部'
goinsert employee select 1,'张三',2
union all select 2,'李四',3goupdate employee set depid=1 where id=3
select * from dep
select * from employee
--看看以上语句出不出错,结果怎样,去掉 ON UPDATE CASCADE,再看看级联删除相关数据记录在外键定义的时候加 ON DELETE CASCADE 指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。
create procedure DeleteData
@XMMC_ID int,
@ErrorNum int output
as
begin tran
truncate table EJZB
delete from YJZB where YJZB_FBH=(select XMMC_BH from XMMC where XMMC_ID=@XMMC_ID)
delete from XMMC where XMMC_ID=@XMMC_ID
if @@error<>0
set @ErrorNum=@@error
else
commit
return @ErrorNum go
头一回见你这种数据结构,还有删除整张表的,呵呵