Oracle 數據庫表中已有重複數據添加惟一鍵(惟一約束)

Oracle 數據庫表中已有重複數據添加惟一鍵(惟一約束)

問題描述

以 demo 舉例,模擬真實場景。html

表 TEST_TABLE 有以下字段和數據:id 是主鍵,code 沒有設置鍵和索引數據庫

ID CODE
1 code1
2 code2
3 code2
4 code2
5 code3

經過以上表中數據能夠看出 code 是有重複數據的,此時若是咱們直接添加惟一鍵,會報錯。oracle

經過 PL/SQL 可視化操做,或者經過 SQL 語句添加(ENABLE NOVALIDATE 的做用是約束新增數據但不會驗證已有數據):ALTER TABLE TEST_TABLE ADD CONSTRAINT UK_TEST_TABLE_CODE UNIQUE(CODE) ENABLE NOVALIDATE;學習

即便用到了 ENABLE NOVALIDATE 也報錯,以下:測試

ORA-02299: cannot validate(TESTUSER.TEST_TABLE.UK_TEST_TABLE_CODE)-duplicate keys found

--Create/Recreate primary, unique and foreign key constraints alter table TEST_TABLE and constraint UK_TEST_TABLE_CODE unique(CODE) novalidate

解決方案

  1. 先添加普通索引
    • CREATE INDEX IDX_TEST_TABLE_CODE ON TEST_TABLE(CODE);
  2. 再添加惟一鍵
    • ALTER TABLE TEST_TABLE ADD CONSTRAINT UK_TEST_TABLE_CODE UNIQUE(CODE) ENABLE NOVALIDATE;

若是你對上面提到的基本概念不太清楚,建議繼續往下看,或者查找資料去學習,而後多在測試數據庫中模擬「犯罪現場」,而後進行還原問題、找問題、分析問題和解決問題。code

基本概念

鍵、索引、約束的區別

通常,咱們看到術語「索引」和「鍵」交換使用,但實際上這兩個是不一樣的。索引是存儲在數據庫中的一個物理結構,鍵純粹是一個邏輯概念。鍵表明建立來實施業務規則的完整性約束。索引和鍵的混淆一般是因爲數據庫使用索引來實施完整性約束。htm

  1. 主鍵索引和主鍵有什麼關係?

主鍵索引是建立主鍵的時候系統自動建立的索引,主鍵要求不重複,不爲空,可是他如何判斷有效率呢?固然是建索引了,總是全表遍歷還不瘋掉。blog

因此創建主鍵會自動的創建主鍵索引。索引

  1. 主鍵和惟一鍵的區別在於惟一鍵能夠爲空,主鍵不能夠get

  2. 創建惟一約束和惟一索引又什麼區別?

同理,創建惟一約束的時候,也會自動的建立惟一索引。創建惟一索引能夠說是惟一約束的一種手段。

基本上,實現起來是沒有什麼區別的。若是實在理解不了,就當同樣好了。

  1. 聚簇索引和非聚簇索引有何區別?

這個上邊已經講和很詳細了,還附有兩篇文章,這裏就不說了。

  1. 約束和主鍵有什麼區別?

約束通常有主鍵約束,外鍵約束,惟一約束等。

分別爲primary key,foreign key,unique 其中主鍵約束只是約束的一種。

其實他們是不一樣概念的東西。

參考資料

相關文章
相關標籤/搜索