C, PHP, VB, .NET

Дневникът на Филип Петров


* Още за ограниченията UNIQUE

Публикувано на 25 февруари 2010 в раздел Бази от Данни.

В досега разглежданите примери при CREATE TABLE на няколко пъти показвахме параметър „UNIQUE“, който се добавяше след дадена променлива. Например:

CREATE TABLE university(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL UNIQUE,
   PRIMARY KEY(id)
)ENGINE=INNODB;

Казахме, че PRIMARY KEY винаги е едновременно NOT NULL и UNIQUE по подразбиране, както и че е възможно да направим комбинация от две или дори повече колони заедно PRIMARY KEY.

В така зададените възможности не можем обаче да се справим с друг проблем – какво ще стане ако искаме да направим комбинация от две или повече колони уникални, но в същия момент НЕ желаем да ги правим PRIMARY KEY? Ето един пример – в горната таблица вместо име на университет ще пазим име и град:

CREATE TABLE university(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL,
   `city` VARCHAR(255) NOT NULL,
   PRIMARY KEY(id)
)ENGINE=INNODB;

Така ние можем да въведем „Технически Университет“ от град „София“, но и „Технически Университет“ от град „Варна“. Така името не може да бъде UNIQUE, но и града не може да бъде UNIQUE (имаме и „Софийски Университет“ от „София“). Всичко щеше да бъде наред ако не се явяваше проблемът, че никой всъщност не ни спира да въведем „Технически Университет“ от град „София“ два или повече пъти. Те ще се различават само по своя id, което обаче си е променлива за вътрешно ползване. Така ние определено се сблъскваме с проблема „дублиране на информация“. В най-честия случай ние НЕ желаем това.

Подсказаното решение е да направим комбинацията от тези колони уникална. Това се постига когато „изнесем“ UNIQUE KEY CONSTRAINT по абсолютно същия начин както го правихме досега с PRIMARY KEY:

CREATE TABLE university(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL,
   `city` VARCHAR(255) NOT NULL,
   UNIQUE KEY (name, city),
   PRIMARY KEY(id)
)ENGINE=INNODB;

Всъщност спокойно можете да пропуснете думата „KEY“ и да използвате само „UNIQUE“. MySQL ще разбере това съкращение коректно.

Задача: Проверете в преди показаните примери от базата данни с университет и базата данни с банки дали този проблем с дублиране на записи е наличен в различните таблици и ако да – поправете ги!

 



2 коментара


  1. Radoslav каза:

    Понеже опитах и не постигнах желания резултат в базата от данни banks със следния код
    update banks
    add unique key(name,country);

    След което добавих (втора) банка Bulbank в Bulgaria
    На грешен път ли съм?

  2. ALTER TABLE banks
    ADD CONSTRAINT UNIQUE KEY(name, country);

    Сигурен ли си, че ограничението е добавено коректно? Alter заявката дава ли успешен резултат?

Добави коментар

Адресът на електронната поща няма да се публикува


*