Проблема в использовании поля TEXT в MySQL Table - PullRequest
2 голосов
/ 16 июня 2011

Это очень прямая проблема, но я пока не нашел решения.Сценарий: у меня есть 2 таблицы в моей БД.Источник 2-й таблицы зависит от SOURCE_URL 1-й таблицы (может быть больше 255 символов, поэтому я использовал TEXT).

create table SOURCES (
        SOURCES_PK int not null AUTO_INCREMENT primary key,
        SOURCE_URL text not null unique,
        DESCRIPTION varchar(255)
);

create table ASSERTIONGROUP (
        ASSERTION_PK int AUTO_INCREMENT primary key,
        LABEL varchar(255),
        SOURCE text not null,
        foreign key (SOURCE) references SOURCES(SOURCE_URL)
);

Я получаю эту ошибку -

BLOB /Столбец ТЕКСТ «ИСТОЧНИК», используемый в спецификации ключа без длины ключа

Я видел обсуждение в этом посте - Ошибка MySQL: спецификация ключа без длины ключа .
НоЯ не могу найти решение.
Я могу удалить уникальный из 1-й таблицы, но потом не могу назначить ограничение внешнего ключа.

Я знаю, что поле TEXT не может быть уникальным, поэтому ищитеальтернатива.

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Для сопоставления с длинным столбцом varchar или blob вам необходимо указать длину индекса:

create table SOURCES (
  SOURCES_PK int not null AUTO_INCREMENT primary key,                    
  SOURCE_URL text not null unique,                    
  DESCRIPTION varchar(255),
  INDEX source_url (source_url(100)) );
//  Key length ----------------^^^ 

Для MyISAM

Максимальная длина ключа составляет 1000 байтов.Это также может быть изменено путем изменения источника и перекомпиляции.В случае ключа длиной более 250 байтов используется больший размер блока ключа, чем по умолчанию - 1024 байта.

Для InnODB

Префиксы ключа индекса могут содержать до 767 байтов.См. Раздел 12.1.8, «Синтаксис CREATE INDEX ».

См .: http://dev.mysql.com/doc/refman/5.5/en/create-table.html

2 голосов
/ 16 июня 2011

К сожалению, вы не можете индексировать целый BLOB и TEXT, потому что длина ключа индекса ограничена.

Вы можете создать индекс FullText только на движке myasam.

Когда мне нужно реализовать ограничение уникальности, я обычно использую определенные столбцы, которые содержат хэш (SHA или MD5) текста и некоторый код для обработки хэш-столкновения.

Это немного некрасиво, но работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...