SQL, sql server 2000 ,表间数据 ,级联更新删除

原创 2007年03月08日 15:46:00
如果,现在有两张表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
 

Sqlserver多表关联更新

在介绍update之前先推荐两个备份表的sql。 Select * into table_2 from table_1//table2可以不存在 Insert into table_2(colum...
  • sinat_35165183
  • sinat_35165183
  • 2017年04月01日 00:38
  • 1624

SQL之树形结构无限级联删除(转)

http://www.cnblogs.com/NewJourney/articles/2366243.html 摘要:树形结构的删除存在其自身特点,特别对于无限级联的树形结构更是如此,今...
  • zunguitiancheng
  • zunguitiancheng
  • 2016年09月03日 12:05
  • 666

sql server的级联更新

sql server的级联更新,作用类似于mysql的update  inner join update T_USER_SIGNATURE    set  SIGNATURE= (se...
  • suyu_yuan
  • suyu_yuan
  • 2016年12月28日 14:31
  • 821

SQLServer2005设置级联删除、级联更新

SQLServer2005设置级联删除、级联更新   在使用LINQ时,数据库中有表外键关联时,删除操作有时会出错,尽管还可以用SQL语句,但有时将这种操作交给数据库,会节省很多开销。 ...
  • albert528108
  • albert528108
  • 2013年09月04日 14:48
  • 1003

SQL SERVER 2008 r2 级联删除

1.先唠两句,在sqlserver中要实现级联删除,不论怎么操作,要实现的是,要引用方允许删除被引用方的值时,自动的删除自己关联的数据 说来,方法无非3中,且看下文 2.定义表时 create ...
  • XuWei_XuWei
  • XuWei_XuWei
  • 2014年03月31日 17:09
  • 2624

数据库__SQL的主键和外键约束_级联更新_级联删除

SQL的主键和外键的作用:    外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时...
  • u010003835
  • u010003835
  • 2015年11月25日 10:02
  • 3752

常用sql----实现关联表的数据级联更新

--搜索表间 的关系--主外键 SELECT   a.table_name,a.constraint_name,b.column_name,p.table_name   from   user_con...
  • u013035314
  • u013035314
  • 2015年03月24日 14:42
  • 2922

sql 添加级联删除和级联更新

添加级联删除 : mysql> alter table t_orderitem add constraint `FK...` foreign key (oid) references t_order...
  • qq_34771403
  • qq_34771403
  • 2017年06月16日 19:12
  • 1313

sqlserver2000下生成表结构脚本和导入导出数据内容

1 表结构生成sql脚本 在指定的表【bjgl_code】(以下均以bjgl_code为例)上点击右键,选择【所有任务】-》【生成sql脚本】,在右下角的【将要写入脚本的对象】中选择bjgl_code...
  • yunxian_19
  • yunxian_19
  • 2016年12月02日 16:46
  • 3137

SQL_数据库基础之级联删除和级联更新

原文: 级联删除 删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。 语法: FOREIGN KEY(COLUMN...
  • svitter
  • svitter
  • 2014年06月16日 08:19
  • 2645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL, sql server 2000 ,表间数据 ,级联更新删除
举报原因:
原因补充:

(最多只允许输入30个字)