如何在现有列上添加级联约束
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 中删除时出现错误,事务将回滚所有已删除的行并保持数据一致。
我有一个 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 中删除时出现错误,事务将回滚所有已删除的行并保持数据一致。