數據遷移報錯--違反唯一性約束

本篇來探討一下,在處理數據,遷移數據和移植數據的過程中,出現“違反唯一性約束”的報錯,出現的原因和解決方法。

首先來了解一下,什麼是唯一性約束:唯一性約束即是當前表單中,需要保證每個數值唯一性的某個(或者多個)列(也叫字段)。需要區分一下,唯一性約束不一定是主鍵,它和主鍵的關係是這樣:主鍵必然是唯一且不為空,但是唯一不一定是主鍵,而且主鍵只能有一個,但是唯一約束僅僅是為了保持某些列具有唯一性而已,所以可以有多列。

以遷移數據為例,在發現報錯為“違反唯一性約束”的時候,需要進行以下處理:

1、如果是oracle的import命令,可以設定參數,採用忽略錯誤導入的方式導入,或者無條件覆蓋原數據。

2、針對數據進行處理,篩選原表,查看是否有重複字段(在有唯一性約束的字段),並處理數據,之後再重新遷移。

注:這裡有個小經驗,在處理很多歷史數據的時候,不免碰到以前人工錄入的數據,或經過多次週轉的數據,除了表面上看到的字符文字的重複之外,還可能是空格!比如我曾經遇到某個7個空格的數據,這種並不是NULL數據,只能重複查詢測試一下,建議模糊查詢。

3、直接在遷移工具中忽略此問題。

最後來細化一下唯一性陎和主鍵約束的區別:

主鍵約束的字段不能為null,而唯一約束的字段可以為null值

1.主鍵約束(PRIMARY KEY)

1) 主鍵用於唯一地標識表中的每一條記錄,可以定義一列或多列為主鍵。

2) 是不可能(或很難)更新.

3) 主鍵列上沒有任何兩行具有相同值(即重複值),不允許空(NULL).

4) 主健可作外健,唯一索引不可;

2.唯一性約束(UNIQUE)

1) 唯一性約束用來限制不受主鍵約束的列上的數據的唯一性,用於作為訪問某行的可選手段,一個表上可以放置多個唯一性約束.

2) 只要唯一就可以更新.

3) 即表中任意兩行在 指定列上都不允許有相同的值,允許空(NULL).

4) 一個表上可以放置多個唯一性約束


分享到:


相關文章: