gpt4 book ai didi

sql - 我似乎无法在 SQL Server Management Studio 中使用外键或触发器创建看似简单的数据库关系

转载 作者:搜寻专家 更新时间:2023-10-30 23:46:59 24 4
gpt4 key购买 nike

因此,我正在尝试尽可能地简化问题。我正在尝试创建 2 个表。

Users 表仅包含主键列 User_ID

还有一个包含 3 列的 Friends 表,Friendship_IDUser_IDFriend_ID

Friendship_ID 是表的主键。我希望 User_IDFriend_ID 是引用 Users 表中的 User_ID 的外键。

这样,User_IDFriend_ID 必须存在于要在 Friends 中创建的 Users 表中表和 Friendship_ID 将在关系中的任何一个从 Users 表中删除时被删除。

因此,我希望删除操作级联通过这两列。但是当我尝试以级联模式指定我的第二个外键时,出现以下错误。

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

这是我想要的布局的数据库图,其中两个外键级联他们的删除。

Database Diagram

我了解如何从该布局中出现多个级联路径,因此我的解决方案read 是使用触发器,所以我确保我从我的外键中删除了所有级联并且相反,我选择使用触发器来完成我需要的删除。这是代码我的触发器

CREATE TRIGGER DeletePrimaryUsers
ON dbo.Users
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;

DELETE FROM Friends WHERE User_ID IN (SELECT User_ID FROM deleted)
DELETE FROM Friends WHERE Friend_ID IN (SELECT User_ID FROM deleted)
DELETE FROM Users WHERE User_ID IN (SELECT User_ID FROM deleted)
END
GO

这也没有用。当我从 Friends 表中删除一行时没有问题,但是当我尝试从我的 Users 表中删除一行时,有时会出现错误。这是一个例子

用户:

User_ID
-------
501
502
503
504
505

friend :

Friendship_ID  User_ID  Friend_ID
----------------------------------
5 503 504
6 503 501
8 503 505

当我尝试删除 Users 表中的第 1 行(User_ID 编号 501)时,出现以下错误。

No rows were deleted

A problem occurred attempting to delete row 1.
Error Source:.NET SqlClient Data Provider
Error Message: The DELETE statement conflicted with the REFERENCE constraint "FK_Friends_Users1". The conflict occurred in database "FriendTest", table "dbo.Friends", column 'Friend_ID'.

Correct the errors and attempt to delete the row again or press ESC to cancel the change(s).

FK_Friends_Users1Friend_ID 列的外键。那个外键,就像那个对于我的 User_ID 列,在我的触发器的 UPDATE 和 DELETE 上设置为 No Action

如有任何帮助,我们将不胜感激。

编辑:

外键创建脚本。

USE FriendTest
ALTER TABLE dbo.Friends WITH CHECK
ADD CONSTRAINT FK_Friends_Users FOREIGN KEY (User_ID)
REFERENCES dbo.Users (User_ID)

USE FriendTest
ALTER TABLE dbo.Friends WITH CHECK
ADD CONSTRAINT FK_Friends_Users1 FOREIGN KEY (Friend_ID)
REFERENCES dbo.Users (User_ID)

最佳答案

触发器应更新如下:

CREATE TRIGGER DeletePrimaryUsers
ON dbo.Users
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM Friends WHERE User_ID IN (SELECT User_ID FROM deleted)
OR Friend_ID IN (SELECT User_ID FROM deleted);
DELETE FROM Users WHERE User_ID IN (SELECT User_ID FROM deleted)
END
GO`

关于sql - 我似乎无法在 SQL Server Management Studio 中使用外键或触发器创建看似简单的数据库关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com