Sql-Server

與預設值的關係

  • May 4, 2012

首先,我知道我的標題有些誤導,但我想不出更好的標題。

這是我現在的關係

CREATE TABLE Events 
(
   ID INT IDENTITY(1,1) NOT NULL,
   Name NVARCHAR(64) NOT NULL,
   DefaultLocationID INT NULL,
   PRIMARY KEY(ID)
)

CREATE TABLE Locations
(
   ID INT IDENTITY(1,1) NOT NULL,
   EventID INT NOT NULL,
   Name NVARCHAR(64) NOT NULL,
   PRIMARY KEY(ID)
)

ALTER TABLE Events ADD FOREIGN KEY(DefaultLocationID) 
   REFERENCES Locations(ID) 
   ON UPDATE CASCADE ON DELETE SET NULL

ALTER TABLE Locations ADD FOREIGN KEY(EventID) 
   REFERENCES Events(ID) 
   ON UPDATE CASCADE ON DELETE CASCADE

我的問題是知道Event可以有 0 個或多個Locations的列表,並且每​​個Location只能與 1 Event相關聯。

我希望Event具有預設Location的能力,但完整性是,如果Event具有Location那麼Locations外鍵必須是相同的Event

我最初的想法是在EventDefaultLocationID 中放置一個可為空的外鍵,但我突然意識到沒有完整性來防止該Location與不同的Event關聯。

我的另一個想法是在Location表上有一個IsDefault欄位,但這並不能阻止多個Locations將其IsDefault欄位設置為 true。

我將如何執行這種關係,最好沒有觸發器和復雜的子查詢?

對於您的第二個選項,您可以在以下位置放置一個過濾的唯一索引:

CREATE UNIQUE INDEX ix_DefaultLocation ON dbo.Locations(EventID, IsDefault)
WHERE IsDefault = 1

這將允許無限的非預設位置,但每個事件 ID 只有一個預設位置。

引用自:https://dba.stackexchange.com/questions/17456