如何使用另一个表中的列添加唯一约束?

时间:2012-05-31 03:41:09

标签: sql sql-server sql-server-2008-r2 unique-constraint

我在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可能都有2个单独的服务(同样,具有不同的SERVICE_ID),其中SERVICE_CODE =" PREMIUM"。

我需要这样的东西:

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

但是(显然)失败了,因为COMPANY_ID列不在SERVICE表中。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)
);

答案 2 :(得分:-1)

将COMPANY_ID添加到服务表。

如果您需要Service表中的行通过此id唯一,那么在此表中保留外键引用是有意义的。