5

現在の列は VARCHAR(255) NOT NULL です。それを TEXT NOT NULL に変更するにはどうすればよいですか?

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

UNIQUE KEY (名前、説明)

現在、列の説明は varchar(255) にあります。次の理由で変更できません。

エラー 1170 (42000): BLOB/TEXT 列 'description' がキーの長さのないキー指定で使用されています

私はそれがテキストである必要があります。面倒で重要なデータがすでに含まれています。作り直すのが大変そう。

4

3 に答える 3

12

UNIQUE KEYの一部としてTEXT列を使用しますか?それは非常に非効率的です!そうしないでください!次のことを強くお勧めします。

  • たとえば、名前の付いた列を追加します'description_hash' char(32) not null default ''
  • descriptionフィールドのハッシュ値をその中に格納します。例:description_hash=MD5(description)
  • キーをに変更しますUNIQUE KEY (name, description_hash)

もちろん、コード内の列を最新の状態に保つ必要があります description_hashが、参照してください-ほとんどの場合、コードを少し変更するだけで済みます。または、これを処理するためにトリガーを使用できます。

于 2011-01-20T08:36:34.280 に答える
4

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

新しいchar(32)列(呼び出してhash一意のインデックスを追加)と2つのトリガーを追加しました。

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インデックスを追加することで、ハッシュ値が常に最新で一意になるようにすることができます。

于 2012-06-13T22:29:40.387 に答える
2
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));
于 2011-01-20T07:52:07.663 に答える