Sql-Server

根據與同一表中另一列的不同值在列上創建唯一約束

  • June 20, 2018

我想讓一個列唯一,但它必須基於與表中另一列的不同值是唯一的。

考慮下表:

CREATE TABLE locations(
 locationId INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
 locationName VARCHAR(50) NOT NULL,
 companyId INT NOT NULL FOREIGN KEY REFERENCES companies (companyId)
);

我的目標是讓位置名稱對於 companyId 列中的每個值都是唯一的。

例如,給定下表:

   [locationId]   [locationName]   [companyId]
=====================================================================
   1              'Example A.'     1          
   2              'Example B.'     1          
   3              'Example A.'     2          
   4              'Example C.'     2    

如果我嘗試執行以下查詢:

INSERT INTO locations (locationName, companyId)
VALUES ('Example B.', 2)

這不會給我一個唯一約束錯誤,因為位置表中沒有行的 locationName 為“範例 B.”且 companyId 為 2

但是,執行這樣的查詢應該會產生唯一約束錯誤:

INSERT INTO locations (locationName, companyId)
VALUES ('Example C.', 2)

因為位置名稱為“範例 C”的行。並且 companyId 2 已經存在。

我試過查詢

CREATE UNIQUE INDEX [UNQ_locationName_companyId]
ON dbo.[locations]([locationName])
WHERE ([companyId] IS DISTINCT);

但是 IS DISTINCT 不是有效的 SQL 語法,但我想不出正確的方法來實現這一點。

任何幫助將不勝感激!

似乎應該這樣做:

CREATE UNIQUE INDEX [UNQ_locationName_companyId]
ON dbo.[locations]([locationName],[companyId]);

引用自:https://dba.stackexchange.com/questions/210162