Sql-Server
與預設值的關係
首先,我知道我的標題有些誤導,但我想不出更好的標題。
這是我現在的關係
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。
我最初的想法是在Event表DefaultLocationID 中放置一個可為空的外鍵,但我突然意識到沒有完整性來防止該Location與不同的Event關聯。
我的另一個想法是在Location表上有一個IsDefault欄位,但這並不能阻止多個Locations將其IsDefault欄位設置為 true。
我將如何執行這種關係,最好沒有觸發器和復雜的子查詢?
對於您的第二個選項,您可以在以下位置放置一個過濾的唯一索引:
CREATE UNIQUE INDEX ix_DefaultLocation ON dbo.Locations(EventID, IsDefault) WHERE IsDefault = 1
這將允許無限的非預設位置,但每個事件 ID 只有一個預設位置。