Обеспечение уникальности на varchar больше 255 в MYSQL / InnoDB - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть таблица, которая содержит URL-адреса, некоторые из которых длиннее 255 символов. Я хочу наложить ограничение уникальности на столбец URL, но MySQL не позволяет мне создавать ключ на URL. Я использую таблицу InnoDB / UTF8. Насколько я понимаю, он использует несколько байтов на символ с пределом 766 байтов для ключа (в InnoDB).

Что представляет собой элегантный способ сохранения уникальности строк на основе URL-адреса?

Ответы [ 3 ]

4 голосов
/ 23 ноября 2011

Для MySQL 5.7 или новее см. Ответ Андре Далчера , чтобы узнать, как лучше использовать сгенерированные столбцы.


Вы можете использовать SHA1-хэш изURL как уникальный ключ.Есть вероятность, что два URL имеют одинаковый хэш, но вероятность этого настолько смехотворно мала, что для практических целей этот метод должен работать нормально.


Вы также можете настроить триггер, чтобыhash столбец вычисляется автоматически, когда вы вставляете:

CREATE TRIGGER mytrigger
BEFORE INSERT
ON foo
FOR EACH ROW SET
    NEW.hash = SHA1(NEW.url)
2 голосов
/ 18 августа 2016

В MySQL 5.7.6 или более поздней версии вы можете сделать это, используя сгенерированный столбец , содержащий хэш столбца, для которого вы хотите установить ограничение уникальности.

По умолчанию создаются столбцы VIRTUAL, что означает, что значения никогда не сохраняются на диске. Виртуальные столбцы могут быть проиндексированы только в версиях MySQL> = 5.7.8 с использованием механизма InnoDB; для MyISAM или для более старых версий MySQL вам придется использовать столбец STORED.

mysql> CREATE TABLE url_hash_test (
    ->   url TEXT,
    ->   url_hash VARCHAR(32) AS (md5(url)),
    ->   UNIQUE(url_hash)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO url_hash_test SET url='http://example.com';
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO url_hash_test SET url='http://example.com';
ERROR 1062 (23000): Duplicate entry 'a9b9f04336ce0181a08e774e01113b31' for key 'url_hash'
0 голосов
/ 23 ноября 2011

Вы можете разделить URL-адреса на 2 или более столбцов и сделать комбинацию (URLpart1, URLpart2, ..., URLpartN) уникальной.Максимально допустимая длина индекса будет увеличена с 767 до 3072 байтов.Пример:

CREATE TABLE atest
( id INT NOT NULL AUTO_INCREMENT 
, a VARCHAR(255) NOT NULL
, b VARCHAR(255) NOT NULL DEFAULT ''
, c VARCHAR(255) NOT NULL DEFAULT ''
, d VARCHAR(255) NOT NULL DEFAULT ''
, PRIMARY KEY (id)
, UNIQUE INDEX url_idx (a,b,c,d)
) ENGINE = InnoDB ;
...