MYSQL中唯一約束和唯一索引的區別


1、唯一約束和唯一索引,都可以實現列數據的唯一,列值可以有null。
2、創建唯一約束,會自動創建一個同名的唯一索引,該索引不能單獨刪除,刪除約束會自動刪除索引。唯一約束是通過唯一索引來實現數據的唯一。
3、創建一個唯一索引,這個索引就是獨立,可以單獨刪除。
4、如果一個列上想有約束和索引,且兩者可以單獨的刪除。可以先建唯一索引,再建同名的唯一約束。
5、如果表的一個字段,要作為另外一個表的外鍵,這個字段必須有唯一約束(或是主鍵),如果只是有唯一索引,就會報錯。



  約束是業務檢查,比方說非空約束,check約束,那是檢查字段非空,是否符合check。而索引是一種數據結構, rowid與字段值的鍵值對.  兩個東西的效果是一樣。但:在建立唯一約束時,會自動創建一個唯一索引.並且,失效該約束時,索引自動刪除.而創建唯一索引則不會自動創建唯一約束.因此在建表時,如果要創建唯一索引,最好先建唯一索引再創建唯一約束.這樣的話,在進行大批量數據插入時,可以先失效約束,插入完成后再進行索引重建.
  除了引文中提到的,要被外鍵引用必須有唯一約束,還有這個區別:索引的鍵不一定要和唯一約束完全匹配,唯一約束可以只用索引的前導列。



例子:
create table t (n1 number,n2 number);
create index t_idx on t(n1,n2);
上面只是創建了兩個列的復合索引,並不要求是唯一索引。
alter table t add constraint t_uk unique (n1) using index t_idx;
可以使用這個索引來創建唯一約束, 而且它只在第一個列上唯一,也就是說唯一約束比索引更加嚴格。
那么這個索引的第二個列有什么意義?有些時候,帶一些冗余列可以使得你直接從索引中取到所有SELECT的數據而無需回表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM