2

これは非常に単純な問題ですが、私はまだ解決策を見つけていません。シナリオは、DBに2つのテーブルがあることです。2番目のテーブルのソースは1番目のテーブルのSOURCE_URLに依存しています(255文字を超える可能性があるため、TEXTを使用しました)。

create table SOURCES (
        SOURCES_PK int not null AUTO_INCREMENT primary key,
        SOURCE_URL text not null unique,
        DESCRIPTION varchar(255)
);

create table ASSERTIONGROUP (
        ASSERTION_PK int AUTO_INCREMENT primary key,
        LABEL varchar(255),
        SOURCE text not null,
        foreign key (SOURCE) references SOURCES(SOURCE_URL)
);

このエラーが発生します-

キーの長さなしでキー指定で使用されるBLOB/TEXT列'SOURCE'

この投稿で議論を見てきました-MySQLエラー:キーの長さがないキーの指定
しかし、解決策を見つけることはできません。
最初のテーブルから一意を削除することはできますが、外部キー制約を割り当てることができません。

フィールドは一意ではないことを知っているTEXTので、別のフィールドを探しています。

4

2 に答える 2

3

長いvarcharまたはblob列と照合するには、インデックスの長さを指定する必要があります。

create table SOURCES (
  SOURCES_PK int not null AUTO_INCREMENT primary key,                    
  SOURCE_URL text not null unique,                    
  DESCRIPTION varchar(255),
  INDEX source_url (source_url(100)) );
//  Key length ----------------^^^ 

MyISAMの場合

キーの最大長は1000バイトです。これは、ソースを変更して再コンパイルすることによっても変更できます。250バイトより長いキーの場合、デフォルトの1024バイトよりも大きいキーブロックサイズが使用されます。

InnODBの場合

インデックスキープレフィックスは最大767バイトです。セクション12.1.8「CREATEINDEX構文」を参照してください。

参照:http ://dev.mysql.com/doc/refman/5.5/en/create-table.html

于 2011-06-16T15:54:08.897 に答える
2

残念ながら、インデックスキーの長さには制限があるため、BLOBとTEXT全体にインデックスを付けることはできません。

フルテキストインデックスは、myasamエンジンでのみ作成できます。

一意性制約を実装する必要がある場合、通常、テキストのハッシュ(SHAまたはMD5)を含む特定の列と、ハッシュの衝突を処理するためのコードを使用します。

少し醜いですが、動作します

于 2011-06-16T15:25:27.707 に答える