[转载]CASCADE——SQL, sql server 2000 ,表间数据,级联更新删除_GCLsoft ...

如果,现在有两张表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 cascade
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
二、另外,我们也xx可以自已写一个触发器来实现此功能
    
    
     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 )
     BEGIN

    update C set C.id='xx' where )
     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。

本文来自CSDN博客,转载请标明出处:

sql外键约束NO ACTION,CASCADE,SET NULL,SET DEFAULT

NO ACTION
指定如果试图删除/修改某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE/UPDATE语句。
CASCADE、SET NULL 和 SET DEFAULT
允许通过删除或更新键值来影响指定具有外键关系的表,这些外键关系可追溯到在其中进行修改的表。如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestamp 列的外键或主键指定 CASCADE。
ON DELETE CASCADE
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。
ON UPDATE CASCADE
指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。 (如果 timestamp 列是外键或被引用键的一部分,则不能指定 CASCADE。 )
ON DELETE SET NULL
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。目标表的所有外键列必须可为空值,此约束才可执行。
ON UPDATE SET NULL
指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。目标表的所有外键列必须可为空值,此约束才可执行。
ON DELETE SET DEFAULT
指 定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。目标表的所有外键列必须具 有默认值定义,此约束才可执行。如果某个列可为空值,并且未设置显式的默认值,则会使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。
ON UPDATE SET DEFAULT
指 定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。目标表的所有外键列必须具 有默认值定义,此约束才可执行。如果某个列可为空值,并且未设置显式的默认值,则会使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。


本文来自CSDN博客,转载请标明出处:



郑重声明:资讯 【[转载]CASCADE——SQL, sql server 2000 ,表间数据,级联更新删除_GCLsoft ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——