具有相同表的无循环引用的表模式

时间:2013-09-06 21:35:10

标签: sql sql-server circular-reference

我有一个名为States的表,其中包含ID和州名(Indiana)。我需要通过尝试使用相同的表来为每个州创建一个具有相邻状态的表。每次我都会遇到循环引用。这与SQL Server有关。我希望级联参与删除和更新。

STATES
Id
State

这就是我想要的,但我不断收到循环引用错误。我需要以某种方式结合状态表中的两个ID,思考?

STATES           ADJOININGSTATESTATE        ADJOININGSTATE
                 Id
Id       ->      StateId              ->    StateId
State            AdjoiningStateId     ->    Id

1 个答案:

答案 0 :(得分:1)

SQL Server不会让你像这样级联,你需要使用触发器。这是一个如何进行删除的示例。如果你真的认为需要,更新会留给读者练习。

Create Table AdjoiningStates (
    State1ID int not null constraint FK_AdjoiningStates_States1 Foreign Key References States,
    State2ID int not null constraint FK_AdjoiningStates_States2 Foreign Key References States,
    Constraint PK_AdjoiningStates Primary Key (State1ID, State2ID)
)
Go
Create Trigger States_Delete On States Instead Of Delete As
    Delete AdjoiningStates From AdjoiningStates a inner join deleted d on a.State1ID = d.StateID
    Delete AdjoiningStates From AdjoiningStates a inner join deleted d on a.State2ID = d.StateID
    Delete States From States s inner join deleted d on s.StateID = d.StateID
Go

在某些版本的SQL上,如果这将成为一个瓶颈,那么在多次使用它之前将删除的表复制到临时表中会更有效。

Example Fiddle