2012-05-31 41 views
4

我在SQL Server 2008 R2中3個表,看起來像這些:如何使用另一個表中的列添加唯一約束?

DB Model

一個公司可能有很多的LSP。一個LSP可能有許多服務。

我需要確保SERVICE_CODE唯一標識公司內的SERVICE記錄。換句話說,COMPANY_ID + SERVICE_CODE應該唯一標識整個系統中的一個SERVICE記錄。

例如:COMPANY-A可能不具有2個具有相同SERVICE_CODE的服務(具有2個不同的SERVICE_ID)。但是,COMPANY-A和COMPANY-B可能都有兩個獨立的服務(同樣具有不同的SERVICE_ID),其中SERVICE_CODE =「PREMIUM」。

我需要的是這樣的:

alter table "SERVICE" 
add constraint "SERVICE_Index01" 
unique ("COMPANY_ID", "SERVICE_CODE") 

但(顯然)失敗的原因是COMPANY_ID列不在服務表。

在此先感謝您的幫助。

+0

Service_Code是唯一的嗎?起初我以爲Service_ID是自然鍵Service_Code的代理鍵。但是,如果兩家公司可以擁有不同的服務代碼,並且服務代碼爲「高級」,則表明不然。 – 8kb

回答

4

你可以使用一個indexed view作爲外部約束:

CREATE VIEW dbo.CompanyServices 
WITH SCHEMABINDING 
AS 
SELECT 
    c.COMPANY_ID, 
    s.SERVICE_CODE 
FROM  dbo.COMPANY c 
INNER JOIN dbo.LSP  l ON c.COMPANY_ID = l.COMPANY_ID 
INNER JOIN dbo.SERVICE s ON l.LSP_ID  = s.LSP_ID 
GO 

CREATE UNIQUE CLUSTERED INDEX UQ_CompanyServices 
ON dbo.CompanyServices (COMPANY_ID, SERVICE_CODE); 

該指數將確保有沒有在你的數據(COMPANY_ID, SERVICE_CODE)重複。

+0

這看起來很棒!謝謝!我今天會嘗試讓你知道它是如何去的 –

+0

它的工作原理,謝謝! –

1

各公司是否限於一個LSP? Service_Code是唯一的嗎(或者有兩個服務代碼「PREMIUM」和不同的Service_ID)?

CREATE TABLE dbo.Company 
(
    CompanyID INT PRIMARY KEY 
    -- , ... 
); 

CREATE TABLE dbo.LSP 
(
    LSPID  INT PRIMARY KEY, 
    CompanyID INT FOREIGN KEY REFERENCES dbo.Company(CompanyID) -- UNIQUE? 
    -- , ... 
); 

CREATE TABLE dbo.Service 
(
    ServiceID INT PRIMARY KEY 
    -- , ... 
); 

CREATE TABLE dbo.LSP_Service 
(
    LSPID  INT FOREIGN KEY REFERENCES dbo.LSP(LSPID), 
    ServiceID INT FOREIGN KEY REFERENCES dbo.Service(ServiceID), 
    PRIMARY KEY (LSPID, ServiceID) 
); 
+0

公司可能有許多LSP。只要屬於兩個不同的公司,可能有兩個SERVICE(具有不同的ID)和相同的SERVICE_CODE。我會更新這個例子來說明這一點。謝謝。 –

-1

將COMPANY_ID添加到服務表中。

如果您需要Service表中的行由此id唯一,那麼在此表中保留外鍵引用是有意義的。

+1

但是,這將是多餘的,因爲Company_ID已經在LSP表中。 –

+0

謝謝,但我在跳躍有一種方法可以在不更改任何表格的情況下執行此操作。 –

+0

如果你不能改變任何表格,我不認爲你可以使用一個約束來實現你的目標,因爲你的表格不是很好的建模。您可能不得不求助於觸發器,因爲並非所有業務規則都可以使用聲明性約束輕鬆實施。我沒有花足夠的時間在這一個100%肯定,但這是我的第一印象。 –