如何在现有列上添加级联约束

how to add cascade constraint on existing columns

我有一个 table t1,它有一个主键 t1id.I 有另一个 table t2,它有列 t1id,它是 t1 的 t1id 的外键 table.Please查看查询

create table T1
(
    t1idint primary key IDENTITY(1,1),

    Name varchar(200) not null

);




create table T2
(
    t2idint primary key IDENTITY(1,1),

   t1id int,
    nod bigint,
    foreign key ( t1id) references T1(t1id)
);

还有更多 table 与 T2 table 链接,我没有在这里展示。

我在表 T1 和 T2 中都插入了一些值。

现在要从 T1 中删除一行,我必须首先从 T2 中删除一行,然后由于外键关系,我只能从 T1 中删除一行。

所以我认为添加级联约束是个好主意

我试过如下

  ALTER TABLE T2
ADD CONSTRAINT fk_T2id
FOREIGN KEY (t1id)
REFERENCES T1(t1id)
ON DELETE CASCADE;

但我收到以下错误

消息 1785,级别 16,状态 0,第 1 行 在 table 'T2' 上引入 FOREIGN KEY 约束 'fk_t1id' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 消息 1750,级别 16,状态 0,第 1 行 无法创建约束。查看以前的错误。

我遇到过很多次你的情况,但从未使用过级联。我做了一个 SP,它会得到我想删除的 ID,然后我自己在事务中删除。参见示例

CREATE PROCEDURE [dbo].[spConfiguration_Table1_Del]
@ID int
AS

Declare @ERR int 
set @ERR = 0
begin tran

    DELETE FROM Table1 WHERE ID = @ID
    set @ERR = @@Error

    if @ERR = 0 begin
    DELETE FROM Table2 WHERE ID IN (SELECT ID FROM Table3 WHERE ID = @ID)
    set @ERR = @@Error
    end

    if @ERR = 0 begin 
    DELETE FROM Table3 WHERE ID = @ID 
    set @ERR = @@Error
    end

if @ERR = 0 commit tran
else rollback tran

通过这种方式,您可以控制删除发生的方式,如果从一个 table 中删除时出现错误,事务将回滚所有已删除的行并保持数据一致。