2017-05-08 89 views
1

我目前正在重構一個設計不佳的數據庫,我爲了完整性目的而要做的事情之一是根據幾個變量創建一個獨特的記錄。t-SQL - 對具有多個條件的列的約束

我使用的表是行情,有問題的列是報價編號,我需要的是這對於每個公司和組是唯一的,因此例如Quote001應該是唯一的,除非有新公司/小組使用。

所以你可以有Quote001company1group1,但隨後如果一個新的報價與company1group1取得了新的報價數量應該Quote002。但是,如果Company2group1進行報價,則應回到Quote001

我不確定如何最有效地實現這一點,使用數據庫中的約束。

謝謝, 大衛

+0

後與預期的結果 – Madhivanan

+1

一些示例數據這不是一個答案可言,但是這有什麼錯有對所有公司和集團完全獨特的報價是多少?這意味着即使您只有一個報價編號,您也可以在不需要其他信息的情況下提取記錄。 – Matthew

+0

同意@Matthew,只是增加一個'int'值,如果你真的需要在生成的任何文檔中加上'Quote00x'開始。 – iamdave

回答

2

你需要的唯一約束。

  ALTER TABLE Quotes 
      ADD CONSTRAINT ucQuote UNIQUE (QuoteNumber, Company, Group) 
4

如果你已經有這個表上的標識列,我會用它來爲qoute編號創建一個計算列。如果你沒有alrady,你可以添加它。

要做到這一點,首先需要定義一個UDF,將做計算你:

CREATE FUNCTION dbo.CalculateQuoteNumber(@id int, @Company int, @Group int) 
RETURNS int 
AS 
BEGIN 
    RETURN 
    (
     SELECT COUNT(*) 
     FROM YourTable 
     WHERE Company = @Company 
     AND [Group] = @Group 
     AND id <= @id    
    ) 
END 
GO 

然後,您添加的引用數作爲計算列:

ALTER TABLE YourTable 
    ADD QuoteNumber as dbo.CalculateQuoteNumber(id, Company, [Group]) 

現在sql server會爲你做計算,並且你是安全的,因爲計算列不能被用戶插入或更新。

You can see a live demo on rextester.