以 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
CREATE INDEX IDX_TEST_TABLE_CODE ON TEST_TABLE(CODE);
ALTER TABLE TEST_TABLE ADD CONSTRAINT UK_TEST_TABLE_CODE UNIQUE(CODE) ENABLE NOVALIDATE;
若是你對上面提到的基本概念不太清楚,建議繼續往下看,或者查找資料去學習,而後多在測試數據庫中模擬「犯罪現場」,而後進行還原問題、找問題、分析問題和解決問題。code
通常,咱們看到術語「索引」和「鍵」交換使用,但實際上這兩個是不一樣的。索引是存儲在數據庫中的一個物理結構,鍵純粹是一個邏輯概念。鍵表明建立來實施業務規則的完整性約束。索引和鍵的混淆一般是因爲數據庫使用索引來實施完整性約束。htm
主鍵索引是建立主鍵的時候系統自動建立的索引,主鍵要求不重複,不爲空,可是他如何判斷有效率呢?固然是建索引了,總是全表遍歷還不瘋掉。blog
因此創建主鍵會自動的創建主鍵索引。索引
主鍵和惟一鍵的區別在於惟一鍵能夠爲空,主鍵不能夠get
創建惟一約束和惟一索引又什麼區別?
同理,創建惟一約束的時候,也會自動的建立惟一索引。創建惟一索引能夠說是惟一約束的一種手段。
基本上,實現起來是沒有什麼區別的。若是實在理解不了,就當同樣好了。
這個上邊已經講和很詳細了,還附有兩篇文章,這裏就不說了。
約束通常有主鍵約束,外鍵約束,惟一約束等。
分別爲primary key,foreign key,unique 其中主鍵約束只是約束的一種。
其實他們是不一樣概念的東西。