2014-02-22 85 views
0

我在SQL Server中有两个表,一个名为Users,另一个名为Connections,连接只是用户和另一个用户之间的连接,所以我的表是这样的:SQL Server 2008:无法为同一父表创建两个外键

CREATE TABLE Users(
    UserUID int IDENTITY NOT NULL, 
    UserUN NVARCHAR(100) NOT NULL, 
    UserPassword NVARCHAR(100) NOT NULL, 

    PRIMARY KEY(UserUID) 
) 

CREATE TABLE Connections(
    _CID int IDENTITY NOT NULL, 
    _UID1 int not null, 
    _UID2 int not null, 
    _ConDate datetime null DEFAULT GETDATE(), 

    PRIMARY KEY(_CID), 
    FOREIGN KEY(_UID1) REFERENCES Users(UserUID) ON DELETE CASCADE, 
    FOREIGN KEY(_UID2) REFERENCES Users(UserUID) ON DELETE CASCADE 
) 

但每次我运行查询时,它抛出错误:

Introducing FOREIGN KEY constraint 'FK_Connectio__UID2__69B1A35C' on table 'Connections' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我试着在谷歌搜索,我发现说我应该做一个触发的答案,但我不不知道那是什么。我希望我能找到一些答案并且非常感谢。

+1

你考虑呢?指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或者修改其他FOREIGN KEY约束。“这对你有用吗? – usr

回答

1

与你试图定义表结构的问题是:

假设你有Users ID为1的记录,并在Connections与_UID1 = 1的记录,_UID2 = 1了。从逻辑上讲,在这种情况下,这没什么意义,但数据库不知道什么Users的含义,也不知道Connections的含义。

现在,您删除该用户。因为_UID1的ON DELETE CASCADE,那么Connections记录也应该被删除。由于_UID2的ON DELETE CASCADE,应该再次删除该Connections记录。这是SQL Server的技术限制,它不能处理同一行上的多个操作,并且不知道应该如何确保在该情况下行只被删除一次。

为防止出现此问题,ON DELETE CASCADE根本不允许在可能导致对同一行进行多次更新的情况下。

I tried searching in google and i found an answer that says I should do a trigger, but I don't know what is that.

触发器是一个自定义操作,它可以包含任意SQL命令,会自动运行后(甚至“时”),您在一个表中的任何修改。我可以更详细地解释,但不像你发现的,我认为你不应该那样做。

相反,如果你想删除用户1,我会建议写它作为两个独立的DELETE声明:

DELETE Connections WHERE _UID1 = 1 OR _UID2 = 1; 
DELETE Users WHERE UserUID = 1;