2012-03-02 10 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の - フィールドの一意にします]の可能性のある重複助けをdidntの(http://stackoverflow.com/questions/5038040/mysql-make-a-field-unique) – bernie

+0

に、すべてのクエリは、同じエラーを与えます#1170 - キーの長さを指定しないでキー仕様で使用されるBLOB/TEXT列 'post_title' –

+0

投稿のタイトルを一意にする必要はありません。投稿IDは一意です。誰かが投稿に投票すると、 post_idに基づいて問題が発生しないようにします –

答えて

0

これを試してみてください。

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

ERROR#1170 - BLOB/TEXT列 'post_title'はキーの長さなしでキー仕様で使用されます –

+1

問題を再現できるようにスキーマを投稿できますか? –

+0

申し訳ありませんが、どういう意味ですか?あなたが話しているスキーマは? –

0

私はあなたがPOST_TITLEフィールドに長さを追加する必要があると思います。それにいくつかの番号を付けて、エラーを解決する必要があります。

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

そのショットを付けます。

+0

同じエラー#1170 - BLOB/TEXT列 'post_title'キーの長さなしでキー仕様で使用されます –

4

ここでエラーが発生するのは、MySQLがBLOBまたはTEXT列の最初のN個の文字のみをインデックスできるためです。したがって、主にTEXTまたはBLOBのフィールド/列型がある場合、またはTINYBLOB、MEDIUMBLOB、LONGBLOB、TINYTEXT、MEDIUMTEXT、LONGTEXTなどのTEXT型またはBLOB型に属するフィールド/列型が主キーまたは索引として作成される場合に、エラーが主に発生します。 length値を持たない完全なBLOBまたはTEXTでは、MySQLはカラムの一意性を保証することができず、それは可変で動的なサイズの です。したがって、インデックスとしてBLOB型またはTEXT型を使用する場合、MySQLのキー長を決定できるように、Nの値を指定する必要があります。ただし、MySQLはTEXTまたはBLOBの制限をサポートしていません。 TEXT(88)は単純に機能しません。

解決策は、TEXTを削除し、lenghtが255のVARCHARデータ型に設定します(デフォルトの長さはBY)。

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

あなたはその変換を行うために完全な文章を教えてください。 –

+0

テーブルを作成した場合は、これを記述します。 "alter table hotaru_posts change post_title post_title varchar(255)COLLATE utf8_unicode_ciユニークキー;" – Dhruvisha

関連する問題