Mai mult
Când trebuie să folosesc o constrângere unică în loc de un index unic?
Atunci când o coloană să aibă valori distincte, pot folosi fie o constrângere
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
sau pot folosi un index unic
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
Coloane cu constrângeri unic pare a fi bun candidați pentru indicii unice.
Sunt acolo orice motive cunoscute de a utiliza constrângeri unic și să nu utilizeze indicii unice în loc?
200
6
Sub capota o constrângere unică este pusă în aplicare în același mod ca un index unic - un index este necesar pentru a îndeplini în mod eficient cerința de a impune constrângeri. Chiar dacă indexul este creat ca un rezultat de o constrângere UNICĂ, interogarea planner poate folosi ca orice alt indice dacă se vede ca cel mai bun mod de a aborda o anumită interogare.
Deci, pentru o bază de date care suportă atât caracteristici de care alegerea de a folosi de multe ori va veni în jos pentru stilul preferat și consistență.
Dacă sunteți de planificare pentru a utiliza indicele ca un index (de exemplu, codul se poate baza pe căutare/sortare/filtrare pe acel teren să fie rapid) mi-ar utiliza în mod explicit un index unic (și comentariu sursa), mai degrabă decât o constrângere de a face clar - în acest fel, dacă unicitatea cerință este schimbat într-o revizuire ulterioară a aplicației (sau alte coder) va ști să asigurați-vă că un non-index unic este pus în loc de unul unic (doar scoate o constrângere unică ar elimina index complet). De asemenea, un anumit indice poate fi numit într-un index indiciu (de exemplu, CU(INDEX(ix_index_name)), care nu't cred că este cazul pentru indicele creat în spatele scenei pentru gestionarea unicitatea cum e puțin probabil să-i știu numele.
De asemenea, dacă aveți doar nevoie pentru a pune în aplicare unicitatea ca o regulă, mai degrabă decât domeniul nevoie să fie căutat sau utilizate pentru sortare, apoi m-am'd folosi constrângere, din nou, pentru a face utilizarea preconizată mult mai evident atunci când cineva se uită la masa ta definiție.
Rețineți că, dacă utilizați atât o constrângere unică și un index unic pe același câmp al bazei de date nu va fi destul de luminos pentru a vedea duplicarea, așa că se va termina cu doi indici care va consuma spațiu suplimentar și încetini rând insertii/actualizări.
În plus față de punctele în alte răspunsuri, aici sunt unele diferențe esențiale între cele două.
Notă: mesajele De eroare sunt de SQL Server 2012.
Erori
Încălcarea de o constrângere unică întoarce eroare 2627.
Încălcarea un index unic întoarce eroare 2601.
Dezactivarea
O constrângere unică nu poate fi dezactivat.
Dar index unic în urmă o restricție de cheie primară sau o constrângere unică poate fi dezactivat, la fel ca orice index unic. Hat-sfat Brain2000.
Notă de obicei de avertizare că dezactivarea un index grupat face datele inaccesibile.
Opțiuni
Constrângeri unic suport opțiuni de indexare ca
FILLFACTOR " și " IGNORE_DUP_KEY
, deși acest lucru nu't a fost cazul pentru toate versiunile de SQL Server.Incluse Coloane
Grup indici pot include non-indexate coloane (denumite o acoperire index, aceasta este o mare îmbunătățire a performanțelor). Indicii spatele CHEII PRIMARE și constrângeri UNIC nu poate include coloane. Hat-sfat @ypercube.
Filtrare
O constrângere Unică nu poate fi filtrat.
Un index unic pot fi filtrate.
Constrângeri Cheie Străină
O restricție de Cheie Externă nu poate face referință la un filtrat index unic, deși se poate face referință la un non-filtrat index unic (cred că acest lucru a fost adăugat în SQL Server 2005).
Denumire
Atunci când crearea de constrângere, specificând un nume de constrângere este opțional (pentru toate cele cinci tipuri de constrângeri). Dacă tu nu't specificați un nume apoi MSSQL va genera pentru tine.
Atunci când crearea de indici, trebuie să specificați un nume.
Hat-sfat @i-o.
Link-uri
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx
Pentru a cita MSDN ca o sursă de autoritate:
Și...
Alte în: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
Una dintre diferențele majore între o constrângere unică și un index unic este faptul că o restricție de cheie externă pe o altă masă poate referință coloanele care alcătuiesc o constrângere unică. Acest lucru nu este valabil și pentru indicii unice. În plus, unic sunt definite ca parte a ANSI standard, în timp ce indicii nu sunt. În cele din urmă, constrângere unică în considerare să trăiască în domeniul de logică proiectare de baze de date (care pot fi puse în aplicare în mod diferit de către diferite DB motoare), în timp ce indicele este aspectul fizic. Prin urmare, constrângere unică este mai mult declarativ. Am'd prefera constrângere unică în aproape toate cazurile.
În Oracle o diferență majoră este că puteți crea o funcție-index unic, care nu este greu de realizat cu constrângeri unic:
De exemplu
Deci
fk_xyz
este doar unic de înregistrare care au valoare != 0`.Constrângere UNICĂ este de preferat Index UNIC. Când constrângerea nu este unic, aveți nevoie pentru a utiliza un obișnuit sau non index unic. Constrângere este, de asemenea, un alt tip de index. Indicele este folosit pentru acces mai rapid.
Indicii unice pot avea clauze where. De exemplu, puteți crea indici pentru fiecare an în funcție de data coloană