2012-03-02 14 views
1

有沒有辦法使現有的txt字段唯一(不要接受重複的值)?如何讓一個mysql字段獨一無二?

場:POST_TITLE
類型:文本
校對:utf8_unicode_ci
空:辛
默認值: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 ; 
+0

可能重複[MySQL的 - 做一個領域獨樹一幟]認爲沒有幫助(http://stackoverflow.com/questions/5038040/mysql-make-a-field-unique) – bernie 2012-03-02 03:33:56

+0

,所有查詢都給予同樣的錯誤#1170 - 沒有密鑰長度的密鑰規範中使用的BLOB/TEXT列'post_title' – 2012-03-02 03:56:49

+0

不要求帖子標題是唯一的,它不是必需的,帖子ID是唯一的,所以當有人在任何帖子上投票時,您將更新該行基於post_id,所以它不會產生問題 – 2012-03-02 05:19:31

回答

0

試試這個:

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

錯誤#1170 - 沒有密鑰長度的密鑰規範中使用的BLOB/TEXT列'post_title' – 2012-03-02 03:53:45

+1

您可以發佈模式以便我們可以重現問題嗎? – 2012-03-02 03:55:57

+0

不好意思,你是什麼意思?你在談論什麼模式? – 2012-03-02 03:58:05

0

我認爲你需要的長度添加到POST_TITLE領域。給它一些數字,這應該可以解決錯誤。

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

給一個鏡頭。

+0

相同錯誤#1170 - 密鑰規範中使用的BLOB/TEXT列'post_title',沒有密鑰長度 – 2012-03-02 16:02:41

4

這裏發生錯誤是因爲MySQL只能索引BLOB或TEXT列的前N個字符。因此,錯誤主要發生在TEXT或BLOB的字段/列類型或者屬於TEXT或BLOB類型(例如TINYBLOB,MEDIUMBLOB,LONGBLOB,TINYTEXT,MEDIUMTEXT和LONGTEXT)時,您試圖將其作爲主鍵或索引。如果整個BLOB或TEXT沒有長度值,則MySQL不能保證列的唯一性,因爲它具有可變和動態的大小。因此,當使用BLOB或TEXT類型作爲索引時,必須提供N的值,以便MySQL可以確定密鑰長度。但是,MySQL不支持對TEXT或BLOB的限制。 TEXT(88)根本無法工作。

所以解決方案是刪除TEXT並將其設置爲長度爲255的VARCHAR數據類型。(默認爲lenght)。

`post_title` varchar(255) COLLATE utf8_unicode_ci UNIQUE KEY 
+0

你能告訴完整的句子來做這種轉換嗎? – 2012-03-02 16:01:03

+0

如果你已經創建了表,然後寫這個。 「alter table hotaru_posts change post_title post_title varchar(255)COLLATE utf8_unicode_ci UNIQUE KEY;」 – Dhruvisha 2012-03-03 10:37:41