0

假设我有 2 张桌子

CREATE TABLE [dbo].[People](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Nom] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Transactions](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [BUYER_ID] [int] NOT NULL,
    [SELLER_ID] [int] NOT NULL,
    [DateTransaction] [datetime] NOT NULL,
 CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

逻辑是事务表需要来自人员表的 2 条记录,买家和卖家。

我想要做的是在 BUYER_ID 和 SELLER_ID 列上实现级联删除。

但是,我可以毫不费力地添加一个(任何一个),但是如果我尝试添加第二个,当我去保存时,我会收到一条错误消息......

Unable to create relationship 'FK_Transactions_Buyer'.  
Introducing FOREIGN KEY constraint 'FK_Transactions_Buyer' on table 'Transactions' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

有没有办法在不使用触发器的情况下执行此操作,或者触发器是执行此操作的最佳方法

4

2 回答 2

1

对引用事务的人的 FK 约束可能会导致这种情况。如果不是这种情况,我认为答案是将两个键都包含在一个约束中。如果买方 ID 和卖方 ID 相同,并且此人已被删除,则两个约束都可能会寻求删除同一行。这是我能想到的 SQL 服务器可能会尝试避免的唯一情况......

抱歉,我不能更明确!

于 2013-09-27T13:57:15.233 回答
0

这就是我最终这样做的方式,我严重怀疑这是最好的方式。

我修改了外键以不强制执行外键约束。

ALTER TABLE [dbo].[Transactions] NOCHECK CONSTRAINT [FK_Transactions_Buyer]

ALTER TABLE [dbo].[Transactions] NOCHECK CONSTRAINT [FK_Transactions_Seller]

并且还修改了 Transaction Table 添加了 IsDeleted 字段

[IsDeleted] [bit] NULL

最后,我在 People 表中添加了一个 Delete 触发器,每当在 People 表中删除 Buyer_ID 或 Seller_Id 时,在 Transaction 表中将 IsDeleted 设置为 TRUE

最后,在触发器结束时,我删除了事务中所有标志 IsDeleted 设置为 true 的记录。

CREATE TRIGGER [dbo].[deletePeople]
   ON  [dbo].[People]
   AFTER DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


    DECLARE @DeletedId INT
  SELECT @DeletedId = id FROM deleted  
    -- Insert statements for trigger here
    Update dbo.Transactions SET IsDeleted = 1 WHERE BUYER_ID = @deletedId or SELLER_ID = @deletedId 
    DELETE FROM dbo.Transactions WHERE IsDeleted = 1
END

就像我说的,我怀疑这是一种正确的做法

于 2013-09-27T15:16:24.853 回答