Как сделать поле MySQL уникальным? - PullRequest
1 голос
/ 02 марта 2012

Есть ли способ сделать существующее текстовое поле уникальным (не принимать дублированные значения)?

Поле: post_title
Тип: текст
Сортировка: utf8_unicode_ci
Null: Sim
По умолчанию: NULL

Что произойдет, если кто-то попытается вставить сообщение с существующим заголовком?

Может ли это повлиять на некоторые функциональные возможности моего сайта?

Структура

CREATE TABLE IF NOT EXISTS `hotaru_posts` (
  `post_id` int(20) NOT NULL AUTO_INCREMENT,
  `post_archived` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N',
  `post_updatedts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `post_author` int(20) NOT NULL DEFAULT '0',
  `post_date` timestamp NULL DEFAULT NULL,
  `post_pub_date` timestamp NULL DEFAULT NULL,
  `post_status` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'processing',
  `post_type` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `post_category` int(20) NOT NULL DEFAULT '1',
  `post_tags` text COLLATE utf8_unicode_ci,
  `post_title` text COLLATE utf8_unicode_ci,
  `post_orig_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `post_domain` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `post_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `post_content` text COLLATE utf8_unicode_ci,
  `post_votes_up` smallint(11) NOT NULL DEFAULT '0',
  `post_votes_down` smallint(11) NOT NULL DEFAULT '0',
  `post_comments` enum('open','closed') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'open',
  `post_media` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'text',
  `post_img` text COLLATE utf8_unicode_ci NOT NULL,
  `post_subscribe` tinyint(1) NOT NULL DEFAULT '0',
  `post_updateby` int(20) NOT NULL DEFAULT '0',
  `post_views` int(20) NOT NULL DEFAULT '0',
  `post_last_viewer_ip` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '111.111.111.111',
  PRIMARY KEY (`post_id`),
  KEY `post_archived` (`post_archived`),
  KEY `post_status` (`post_status`),
  KEY `post_type` (`post_type`),
  FULLTEXT KEY `post_title` (`post_title`,`post_domain`,`post_url`,`post_content`,`post_tags`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Story Posts' AUTO_INCREMENT=38275 ;

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

здесь ошибка происходит, потому что MySQL может индексировать только первые N символов столбца BLOB или TEXT.Итак, ошибка в основном возникает, когда существует тип поля / столбца TEXT или BLOB или они принадлежат к типам TEXT или BLOB, таким как TINYBLOB, MEDIUMBLOB, LONGBLOB, TINYTEXT, MEDIUMTEXT и LONGTEXT, которые вы пытаетесь сделать в качестве первичного ключа или индекса.С полным BLOB или TEXT без значения длины MySQL не может гарантировать уникальность столбца, поскольку он имеет переменный и динамический размер.Таким образом, при использовании типов BLOB или TEXT в качестве индекса необходимо указать значение N, чтобы MySQL мог определить длину ключа.Однако MySQL не поддерживает ограничение на TEXT или BLOB.TEXT (88) просто не будет работать.

Таким образом, решение - удалить TEXT и установить тип данных VARCHAR с длиной 255. (BY по умолчанию).

`post_title` varchar(255) COLLATE utf8_unicode_ci UNIQUE KEY
0 голосов
/ 02 марта 2012

Я думаю, вам нужно добавить длину в поле post_title. Дайте ему некоторое число, и это должно устранить ошибку.

ALTER TABLE `hotaru_posts` 
  ADD  UNIQUE INDEX `post_title_Index` (`post_title`,`value`(255));

Дайте этому шанс.

0 голосов
/ 02 марта 2012

Попробуйте:

ALTER TABLE tableName   
  ADD  UNIQUE INDEX `post_title_Index` (`post_title`);
...