5

我在 SQL Server 2008 R2 中有 3 个表,如下所示:

数据库模型

一家公司可能有许多 LSP。一个 LSP 可能有许多 SERVICE。

我需要确保 SERVICE_CODE 唯一标识公司内的服务记录。也就是说,COMPANY_ID + SERVICE_CODE 应该唯一标识整个系统中的一条SERVICE记录。

例如:COMPANY-A 可能没有 2 个具有相同 SERVICE_CODE 的服务(具有 2 个不同的 SERVICE_ID)。但是 COMPANY-A 和 COMPANY-B 可能都有 2 个单独的 SERVICES(同样,具有不同的 SERVICE_ID),SERVICE_CODE = "PREMIUM"。

我需要这样的东西:

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

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

提前感谢您的帮助。

4

3 回答 3

5

您可以使用索引视图作为外部约束:

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)您的数据中没有重复项。

于 2012-05-31T07:50:50.080 回答
1

每个公司是否仅限于一个 LSP?Service_Code 是否唯一(或者是否有两个具有不同 Service_ID 的服务代码“PREMIUM”)?

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)
);
于 2012-05-31T03:56:53.243 回答
-1

将 COMPANY_ID 添加到服务表。

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

于 2012-05-31T04:02:13.680 回答