2011-01-20 10 views
4

現在の列はVARCHAR(255)NOT NULLなので、どうすればTEXT NOT NULLに変更できますか?MySQL:varchar(255)UNIQUEカラムをUNIQUEテキストに変更するにはどうすればいいですか?

注:プロパティの種類を変更する列は、別の列のUNIQUE KEYの組み合わせです。例えば。

UNIQUE KEY(名前、説明)

列説明はVARCHAR(255)に現在あります。私はそれがTEXTである必要がキー仕様で使用されるBLOB/TEXTの列 '説明' キーの長さのない

、:

ERROR 1170(42000):これのためにそれを変更することはできませんそうでなければ、私は全体を再現する必要がありますか?私は退屈で重要なデータをすでに持っています。作り直すのは面倒です。

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

your_length =ユニークキーの

+1

は、グーグルで簡単に答えを得ることができます –

+0

質問を再読してください。申し訳ありません.. – woel

答えて

12

TEXT列をUNIQUE KEYの一部として使用しますか? 非常に非効率です!それをしないでください!そこに例えば名前の追加の列'description_hash' char(32) not null default ''

  • ストアにdescriptionフィールドのハッシュ値を追加します

    • : は、私はあなたを強くお勧めしています。例えば、ご覧のようにdescription_hash=MD5(description)
    • 変更はUNIQUE KEY (name, description_hash)

    への鍵は勿論、あなたは、最新のコード内でdescription_hash列を維持する必要がありますが、う - ほとんどの場合、それはほんの数コードの変更が必要です。 これを処理するためにトリガーを使用することができます。

  • +0

    こんにちは私はテキストをユニークなキーにしようとしていましたが、今はvarcharをユニークなままにしています。 More_Aboutという別のフィールドを作成しました。これが最善の方法であるかどうかはわかりませんが、ユニークなテキストを使用する方法はありません。また、UNIQUEキー列のプロパティを変更する方法も見つけられません。例はあいまいです。私は後で答えを見直します。ありがとう。 – woel

    +0

    あなたは一意のインデックスとしてフルテキストを使用する必要はありません - 上記のように、このテキストから一意のインデックスとしてハッシュ(md5、sha1、fnvなど)だけを使用します。 – Vadim

    1
    alter table your_table 
    modify column your_column text not null; 
    

    1000バイト

    最大鍵長は1000バイトであるを可能にします。これは、ソースを変更して再コンパイルすることによっても変更できます。長い250バイトを超えるキーの場合には、1024バイトのデフォルトよりも大きいキーブロックサイズが両方とも長さ(説明+ 1000年より別の列を長くすることができない)


    使用されるので、

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

    ごめんなさい、私の質問でこれを更新しています。問題はその列もまたユニークキーであると考えられています。 – woel

    +0

    私は理解できません。あなたが列の名前が「説明」であると伝えれば、それを書くことができますか?これは、「名前」と呼ばれる別の列の組み合わせであり、両方ともユニークキーを形成します。どのようにMySQLのクエリでそれを書くには? descriptionプロパティをTEXT NOT NULLに変更するだけです。ありがとう.. – woel

    +0

    alter table table_nameユニークなインデックスの説明を追加する(description(1000)); //こんにちは、これを明確にすることができますか?動いていない。また、あなたのコードは、どの列を変更するか指定していませんか? – woel

    4

    私はまったく同じ問題を抱えていました。

    新しいchar(32)列(これにはhashと呼ばれ、ユニークなインデックスが追加されました)と2つのトリガが追加されました。あなたはハッシュ値が常に最新かつユニークであることを確認することができますトリガを使用してハッシュにUNIQUEインデックスを追加することにより

    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 ; 
    

    関連する問題