Как да използвате уникални индекси в MySQL и други бази данни, MySQL

Ако сте използвали бази данни от известно време, вероятно сте задали първичен ключ на повечето от вашите таблици.

Първичният ключ е уникален идентификатор за всеки запис, например:

Да приемем, че сте добавили следните данни:

документ за самоличностдържава■ площномерразширение
11234567890НУЛА
24498765432142
361390908200НУЛА

След това изпълняваме следната операция INSERT:

Базата данни няма да позволи добавянето на нов запис, защото вече съществува запис с идентификатор, равен на единица. Но за щастие, можем да игнорираме идентификатора от нашия оператор INSERT, генерирайки идентификатора автоматично:

Сега имаме четири записа:

документ за самоличностдържава■ площномерразширение
11234567890НУЛА
24498765432142
361390908200НУЛА
41234567890НУЛА

Можем да добавим почти 17 милиона записа, преди стойността на идентификатора да надхвърли разпределената памет.

Уникални индекси

Уникалните индекси работят почти по същия начин като първичен ключ. Можете обаче да използвате само един първичен ключ, докато можете да създадете произволен брой уникални индекси с произволен брой полета.

В нашия пример искаме да гарантираме, че няма два записа с една и съща държава, регион,основен и вътрешен номер.

Можем да направим това, като модифицираме нашата таблица:

Имайте предвид, че името на индекса ix_phone не е задължително. От друга страна, можем да създадем нашата таблица отново:

Повечето бази данни поддържат уникални индекси, но SQL синтаксисът може да варира.

Нека опитаме да вмъкнем дублиран запис, без да посочваме id:

Ако използвате MySQL, ще се генерира следната грешка:

NULL стойност в MySQL

Казвам "практически всяка база данни", защото MySQL има странна функция. NULL се третира като уникална стойност - поради което не можете да използвате сравнения като value = NULL, но трябва да използвате value IS NULL.

За съжаление това засяга и уникалните индекси, но нищо не е внедрено, за да се коригира това.

Можем да направим нашия първоначален INSERT няколко пъти и всеки път ще бъде създаден нов запис, тъй като полето за разширение е NULL по подразбиране и се счита за уникално:

Да, това е лудост. Не знам за този проблем в други бази данни и дори MySQL работи правилно, ако използвате подсистемата за съхранение на BDB. Тази функция е маркирана като грешка в MySQL, но няма известни планове за коригирането й.

Решение: Уверете се, че всички полета, дефинирани като уникални индекси, не могат да бъдат зададени на NULL. В този пример можем да посочим, че няма разширение, като зададем стойността на 0 или 99999.

Или може би можем да направим полето число със знак и да зададем стойността на -1. Ужасно е, но ще свърши работа.

Въпреки този проблем, уникалните индекси са полезни в много ситуации и ще ви помогнат да запазитецелостта на данните, когато другите програмисти и потребители не са толкова отговорни!

Тази публикация е превод на статията „Как да използваме уникални индекси в MySQL и други бази данни“, изготвена от приятелския екип на проекта Internet Technologies.ru