MySQL: Как изменить уникальный столбец varchar (255) на уникальный текст NOT NULL? - PullRequest
5 голосов
/ 20 января 2011

Текущий столбец VARCHAR (255) NOT NULL, так как мне изменить его на TEXT NOT NULL?

ПРИМЕЧАНИЕ. Столбец, предназначенный для изменения типа своего свойства, представляет собой комбинацию UNIQUE KEY другого столбца. Э.Г.

УНИКАЛЬНЫЙ КЛЮЧ (имя, описание)

Описание столбца в настоящее время в varchar (255). Его нельзя изменить из-за этого:

ОШИБКА 1170 (42000): столбец BLOB / TEXT «описание», используемый в спецификации ключа без длины ключа

Мне нужно, чтобы это было ТЕКСТ, иначе мне нужно воссоздать все это ?? Я получил некоторые утомительные и важные данные уже в нем. Это будет хлопотно для воссоздания.

Ответы [ 3 ]

12 голосов
/ 20 января 2011

Собираетесь ли вы использовать столбец TEXT как часть UNIQUE KEY?Это ОЧЕНЬ неэффективно!Не делай этого!Я настоятельно рекомендую вам:

  • Добавить дополнительный столбец с именем, например, 'description_hash' char(32) not null default ''
  • Сохранить в нем хэш-значение для поля description.Напримерdescription_hash=MD5(description)
  • Измените свой ключ на UNIQUE KEY (name, description_hash)

Конечно, вам нужно будет регулярно обновлять столбец description_hash в своем коде, но, как видите -в большинстве случаев требуется всего несколько изменений кода.Или вы можете использовать триггер для обработки этого.

4 голосов
/ 14 июня 2012

У меня была точно такая же проблема.

Я добавил новый столбец char (32) (я назвал его hash и добавил уникальный индекс для него) и два триггера.

delimiter | 

CREATE TRIGGER insert_set_hash
    BEFORE INSERT ON my_table_name
    FOR EACH ROW BEGIN  
          SET NEW.hash = MD5(NEW.my_text);
    END; |

CREATE TRIGGER update_set_hash
    BEFORE UPDATE ON my_table_name
    FOR EACH ROW BEGIN  
           SET NEW.hash = MD5(NEW.my_text);
    END; |


delimiter ;

Используя триггеры и добавляя индекс UNIQUE для хеша, вы можете быть уверены, что значения хеша всегда будут современными и уникальными.

1 голос
/ 20 января 2011
alter table your_table
modify column your_column text not null;

для уникального ключа

alter table your_table 
add unique index your_index_name (your_column(your_length));

your_length = разрешить до 1000 байт

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


Обе длины (описание + другой столбец не может превышать 1000), поэтому

alter table your_table 
add unique index your_index_name (description(800), another_column(200));
...