3
我有兩個表,其都具有一個「名稱」欄中。這些表格不相互關聯。我希望在這兩列中實施唯一性。索引視圖:UNION ALL /全部加入替代
我一直在試圖建立一個索引視圖出了兩列,但已經發現我不能使用UNION ALL,也沒有一個完整的加盟讓名稱的完整列表。我覺得我錯過了一個明顯的選擇,它可以讓我添加獨特的索引。
我有兩個表,其都具有一個「名稱」欄中。這些表格不相互關聯。我希望在這兩列中實施唯一性。索引視圖:UNION ALL /全部加入替代
我一直在試圖建立一個索引視圖出了兩列,但已經發現我不能使用UNION ALL,也沒有一個完整的加盟讓名稱的完整列表。我覺得我錯過了一個明顯的選擇,它可以讓我添加獨特的索引。
假設兩者的基表對「名稱」唯一約束,那麼唯一的辦法唯一可以侵犯是,如果同一個名字既是表所示。
即你期望加入對他們返回零行。因此,您可以將該連接的結果與具有2行的表交叉連接,並針對該表創建唯一索引。
CREATE TABLE dbo.Two
(
N INT PRIMARY KEY
)
INSERT INTO dbo.Two
VALUES (1),
(2)
GO
CREATE VIEW dbo.UniqueNames
WITH SCHEMABINDING
AS
SELECT T1.Name
FROM dbo.T1
INNER JOIN dbo.T2
ON T1.Name = T2.Name
CROSS JOIN dbo.Two
GO
CREATE UNIQUE CLUSTERED INDEX IX
ON dbo.UniqueNames(Name)
對於基礎表的任何更改,此方法不會導致聚集索引重建嗎? – Andomar
@Andomar - 重建什麼?視圖應該總是不包含行,除非可能臨時拋出違反約束的行。索引視圖維護應該只嘗試和修改基表中的修改行。這就是爲什麼索引視圖有所有限制。 –
感謝您的澄清。我不知道索引視圖是否那麼聰明。 :) – Andomar