sql server 2000 ,表间数据 ,级联更新删除
来源:未知 责任编辑:智问网络 发表时间:2013-10-22 19:28 点击:次
如果,现在有两张表A(id,xx.xx...),C(id,Cid,xx,xx...),预实现C中的id与A 中id级联删除、级联更新/数据同步,可有两种实现方式:
一.
利用sql server自带的级联删除、级联更新功能,即其外键约束途径
alter table dbo.C
add constraint FK_C_A_AID
foreign key(AID) references dbo.A(AID)
on delete cascade
on update casade
go
alter table dbo.C
add constraint FK_C_B_BID
foreign key(BID) references dbo.B(BID)
on delete cascade
on update casade
go
级联更新和级联删除方式:
Alter TABLE [dbo].[T_USERGROUP] ADD
CONSTRAINT [FK_T_USERGROUP_T_ACCTTEMPLATE] FOREIGN KEY
(
[ATNAME]
) REFERENCES [dbo].[T_ACCTTEMPLATE] (
[ATNAME]
) ON Update CASCADE ON Delete CASCADE
二、另外,我们也完全可以自已写一个触发器来实现此功能
A:
int id
varchar(20) name
C:
int id
int Cid
varchar(100) info
假设表A、C的字段如上:
如以级联删除表A、C记录为例,实现语句如下:
(如果删除表A中的记录,则自动删除表C中与表A中id相同的记录)
CREATE TRIGGER trg_a
ON A
FOR INSERT,UPDATE,DELETE
AS
BEGIN
DECLARE @nInsRows INT --用于插入记录条数统计
DECLARE @nCount INT --用于删除记录条数统计
DECLARE @nCOde INT --删除的记录
-- 统计插入的的记录数并存放在@nInsRows里面
SELECT @nInsRows = COUNT(*)
FROM INSERTED
-- 统计删除的记录数并存放在@nCount里面
SELECT @nCount = COUNT(*)
FROM DELETED
IF(@nCount > 0)
BEGIN
delete C from deleted where C.id=deleted.id
END
IF (@nInsRows > 0 AND @nCount = 0) --如果是插入数据
BEGIN
insert into C select * from inserted
END
IF (@nInsRows > 0 AND @nCount > 0) -- 如果是更新数据
BEGIN
select @nCOde=id from inserted
IF EXISTS (select * from C where C.id=@nCOde)
BEGIN
update C set C.id='xx' where id=@nCOde)
END
ELSE
BEGIN
insert into C select * from inserted
END
END
END
另外,下面的一段文字值得体会:
在MS SQL Server中,我们可能会遇到这样的问题:
在触发器中,需要把新插入记录中的某些字段值作为参数去操作另一些记录。
举例:
建一条消息的同时,追加给每个用户一个未读状态,每个用户都有自己的阅读状态。
A消息表
B用户表
C状态表
我们在为A表追加记录的同时,需要为C表追加与B表用户数一样多的用户阅读状态表。
解决这个问题,我们可以把它放在SQL服务器的触发器中,用行级触发器。需要用到以下知识:
deleted 和inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted 表中的所有值,请使用:
SELECT * FROM deleted
触发器代码:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [mys]
ON [dbo].[dt_Message] --dt_Message是上面说的A表,在这里,为它指定行级触发
AFTER INSERT
AS
BEGIN
insert dt_MessageIsOpen (UserId,MessageId) select UserId,Inserted.MessageId from aspnet_Users,Inserted
--被插入数据的MessageIsOpen是上面所说的C表,在这里,它被作为触发器触发之后的操作对象
--作为数据源的有Inserted, aspnet_Users两个表,inserted 是逻辑(概念)表,在这里,它把A表中新插入记录中的MessageId作为数据源参数;aspnet_Users是上面提到的B表,它为C表提供UserId。
END
作者 温文章
一.
利用sql server自带的级联删除、级联更新功能,即其外键约束途径
alter table dbo.C
add constraint FK_C_A_AID
foreign key(AID) references dbo.A(AID)
on delete cascade
on update casade
go
alter table dbo.C
add constraint FK_C_B_BID
foreign key(BID) references dbo.B(BID)
on delete cascade
on update casade
go
级联更新和级联删除方式:
Alter TABLE [dbo].[T_USERGROUP] ADD
CONSTRAINT [FK_T_USERGROUP_T_ACCTTEMPLATE] FOREIGN KEY
(
[ATNAME]
) REFERENCES [dbo].[T_ACCTTEMPLATE] (
[ATNAME]
) ON Update CASCADE ON Delete CASCADE
二、另外,我们也完全可以自已写一个触发器来实现此功能
A:
int id
varchar(20) name
C:
int id
int Cid
varchar(100) info
假设表A、C的字段如上:
如以级联删除表A、C记录为例,实现语句如下:
(如果删除表A中的记录,则自动删除表C中与表A中id相同的记录)
CREATE TRIGGER trg_a
ON A
FOR INSERT,UPDATE,DELETE
AS
BEGIN
DECLARE @nInsRows INT --用于插入记录条数统计
DECLARE @nCount INT --用于删除记录条数统计
DECLARE @nCOde INT --删除的记录
-- 统计插入的的记录数并存放在@nInsRows里面
SELECT @nInsRows = COUNT(*)
FROM INSERTED
-- 统计删除的记录数并存放在@nCount里面
SELECT @nCount = COUNT(*)
FROM DELETED
IF(@nCount > 0)
BEGIN
delete C from deleted where C.id=deleted.id
END
IF (@nInsRows > 0 AND @nCount = 0) --如果是插入数据
BEGIN
insert into C select * from inserted
END
IF (@nInsRows > 0 AND @nCount > 0) -- 如果是更新数据
BEGIN
select @nCOde=id from inserted
IF EXISTS (select * from C where C.id=@nCOde)
BEGIN
update C set C.id='xx' where id=@nCOde)
END
ELSE
BEGIN
insert into C select * from inserted
END
END
END
另外,下面的一段文字值得体会:
在MS SQL Server中,我们可能会遇到这样的问题:
在触发器中,需要把新插入记录中的某些字段值作为参数去操作另一些记录。
举例:
建一条消息的同时,追加给每个用户一个未读状态,每个用户都有自己的阅读状态。
A消息表
B用户表
C状态表
我们在为A表追加记录的同时,需要为C表追加与B表用户数一样多的用户阅读状态表。
解决这个问题,我们可以把它放在SQL服务器的触发器中,用行级触发器。需要用到以下知识:
deleted 和inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted 表中的所有值,请使用:
SELECT * FROM deleted
触发器代码:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [mys]
ON [dbo].[dt_Message] --dt_Message是上面说的A表,在这里,为它指定行级触发
AFTER INSERT
AS
BEGIN
insert dt_MessageIsOpen (UserId,MessageId) select UserId,Inserted.MessageId from aspnet_Users,Inserted
--被插入数据的MessageIsOpen是上面所说的C表,在这里,它被作为触发器触发之后的操作对象
--作为数据源的有Inserted, aspnet_Users两个表,inserted 是逻辑(概念)表,在这里,它把A表中新插入记录中的MessageId作为数据源参数;aspnet_Users是上面提到的B表,它为C表提供UserId。
END
作者 温文章
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>