Максимальный размер уникального ограничения в DB2 9.7

Я создал таблицу: CREATE TABLE myTable (id int СОЗДАЕТСЯ ВСЕГДА КАК ИДЕНТИЧНОСТЬ (НАЧАЛО С 1, ПРИРАЩЕНИЕ НА 1, БЕЗ КЭША) PRIMARY KEY, pcdurl varchar(2000) NOT NULL)

И я хотел бы сделать атрибут pcdurl уникальным ограничением.

Но я получаю ошибку SQL 633. Думаю, это связано с тем, что размер превышает максимально допустимое число. Мой первый вопрос: что это за число?

Здесь указано число 255-n, где n – количество столбцов, допускающих нулевые значения.

Но я также читал об этом page: "Максимальная общая длина столбцов в ограничении UNIQUE (поддерживается индексом UNIQUE, в байтах) 8192"

Итак, мой второй вопрос будет заключаться в том, как я могу решить эту проблему, сохраняя при этом атрибут как ограничение уникального ключа?

заранее большое спасибо


person BPL    schedule 28.06.2012    source источник


Ответы (1)


По сути, вам нужно будет найти меньшее представление pdcurl, чтобы вы и применяли уникальное ограничение для этого представления.

У вас может быть дополнительное поле, которое является хэшем pdcurl, и сделать это хешированное значение уникальным полем. В зависимости от хэш-функции у вас есть небольшой (возможно, крошечный) шанс столкновения. Но это всегда предотвратит дублирование.

Или вы можете обнаружить, что все ваши URL-адреса начинаются с одного и того же пути, и поэтому замените эту часть на .\ или что-то в этом роде?

person MatBailie    schedule 28.06.2012
comment
Большое спасибо за ответ, Демс. Но было бы лучше, если бы я мог найти решение без возможности столкновения. И та же часть URL-адресов имеет длину всего 10 символов. Но знаете ли вы, какой максимальный размер разрешен на 9.7? - person BPL; 28.06.2012
comment
@BPL - не отказывайтесь от хэширования так легко. Посмотрите этот ответ о том, насколько вероятно столкновение с MD5 (когда я говорю крошечный, я действительно имею в виду крошечный) stackoverflow.com/questions/201705/ - person MatBailie; 28.06.2012
comment
@BPL - И википедия показывает, что с MD5 (128 бит) вам нужно сгенерировать 26 000 000 000 значений, чтобы иметь вероятность 0,0000000000000001%, что любое из них столкнулось с любым другим. (Что, на самом деле, лучше, чем большинство аппаратных отказов) en.wikipedia.org/ вики/День рождения_атака - person MatBailie; 28.06.2012
comment
Спасибо за ответы, мы решили использовать хэш-функцию, которая возвращает 256-битный вывод. Теперь я должен найти алгоритм для этого. - person BPL; 29.06.2012