Sql-Server

以程式方式查找創建唯一複合鍵所需的最小欄位集

  • November 15, 2016

我正在將來自不同來源的平面文件導入 SQL Server 中的表中。我正在使用提取中的欄位組合創建一個複合主鍵,這將為我提供每一行的唯一鍵。

我現在的做法是從 1 個欄位開始,然後繼續連接欄位,直到找到一個對所有記錄都是唯一的鍵。這可能會有點耗時,或者我最終可能會連接比我真正需要的更多的列來獲取唯一鍵。

是否有某種 SQL 腳本可以在表上執行,它可以為我提供最少數量的欄位(名稱),我需要連接以獲得唯一鍵?因此,如果表中有 1 個欄位對所有記錄都是唯一的,則將返回該 1 個欄位名稱。如果我需要連接

$$ memberid $$,$$ claimid $$, 和$$ date of service $$為了獲得唯一鍵,那麼這 3 個欄位名稱將是腳本的結果。

我正在使用提取中的欄位組合創建一個複合主鍵,這將為我提供每一行的唯一鍵。

嗯,這不完全是主鍵的用途。是的,它們確實唯一標識每一行,但它們也是支持同級表和子表的關係的基礎。

是否有某種 SQL 腳本可以在表上執行,它可以為我提供最少數量的欄位(名稱),我需要連接以獲得唯一鍵?

不在您已經在做的事情之外,儘管形式可能略有不同,例如可能將數據載入到未定義鍵或唯一索引或唯一約束的表中,然後嘗試創建 PK 或唯一(索引 | 約束)關於各種領域的組合。在任何一種情況下,您可能一開始都不應該這樣做。

一般來說,這種方法存在一些問題:

  • 如果有多個唯一性選項怎麼辦?一個或多個單獨欄位和/或一組或多組多個欄位的任何組合?FieldA可能是唯一的,FieldD+FieldH可能是唯一的。然後怎樣呢?
  • 如果沒有單個欄位或欄位組合是唯一的怎麼辦?如果使用所有欄位仍然無法讓您獲得獨特性,您的計劃是什麼?
  • 導入過程中的不良數據和/或錯誤怎麼辦?由於不知道您一開始可以信任多少數據,因此掃描傳入的數據非常容易出錯。您的系統需要了解傳入數據的好壞,而不僅僅是假設它是好的,並圍繞可能很容易成為外部系統導出過程中的錯誤的業務規則(因為從來沒有發生過 ;-) .
  • 這些導入表中的任何一個是否應該相互關聯?如果是這樣,嘗試以程式方式查找唯一性可能會為應該相關但現在不能的表選擇不同的欄位,因為在至少一個表中的多個欄位組合中找到唯一性,並且該過程在之前找到不兼容的組合相關的組合。
  • 你如何決定類型是什麼?怎麼樣0x02FB4C97?那是一個VARBINARY還是一串十六進製字節?怎麼樣123456?那是INT, BIGINT, VARCHAR, DATETIME(朱利安格式),VARBINARY(沒有前導0x但沒有A-F幫助決定)?
  • 當一個或多個列中的“數據”發生根本變化但出於好的/自然原因時會發生什麼?如果有一個目前為空的欄位並且您認為它是一個字元串但它確實是一個尚未使用的日期欄位,或者自然NULL用於您正在查看的特定導出,該怎麼辦?或者可變長度列的最大長度呢?他們目前僅用於 5 位數字但後來開始將其用於實際評論的“評論”欄位呢?
  • 正如@MaxVernon 在對問題的評論中提到的那樣,隨著新數據的出現,欄位的唯一性可能會發生變化,因為您並不真正了解管理數據如何真實存在的規則。

所以這歸結為:定義 PK 的實際目標是什麼?你想通過這樣做來完成什麼?您是否有理由不只是添加一個IDENTITY欄位,然後在所有導入的欄位中刪除重複項(全部減去該IDENTITY欄位)?

您確實需要首先更多地了解數據的真實性質,然後建構一個表來保存具有與數據應該如何存在相匹配的鍵和約束的數據,而不一定是它如何存在。

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