2

3つのフィールドがあるテーブルがあり、MySQL2つのフィールド間で一意性を強制したいと思います。これが表DDLです:

CREATE TABLE `CLIENT_NAMES` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

このIDフィールドは代理キーです(このテーブルにはETLが読み込まれています)。はCLIENT_NAMEクライアントの名前を含むフィールドですOWNER_ID。IDはクライアントの所有者を示します。

CLIENT_NAMEとの一意のインデックスを使用してこれを強制できると思いましたOWNER_ID

ALTER TABLE `DW`.`CLIENT_NAMES` 
ADD UNIQUE INDEX enforce_unique_idx(`CLIENT_NAME`, `OWNER_ID`);

しかし、MySQLは私にエラーを与えます:

テーブルを更新するためのSQLコマンドの実行中にエラーが発生しました。指定されたキーが長すぎました。キーの最大長は765バイトです(エラー1071)

他に何かアイデアはありますか?

4

4 に答える 4

9

MySQL は、765 バイトを超えるキーに対して一意性を強制することはできません (明らかに 500 文字の UTF8 文字がこの制限を超える可能性があります)。

  1. CLIENT_NAME は本当に 500 文字にする必要がありますか? 少し過剰に思えます。
  2. ハッシュ (CLIENT_NAME) である新しい (短い) 列を追加します。代わりに、MySQL を取得して、そのハッシュに一意性を適用してください。
于 2008-09-18T04:46:34.620 に答える
0

このテーブルについては少し奇妙に思えます。私は実際にそれをリファクタリングすることを考えます。IDとOWNER_IDは何を指し、それらの間の関係は何ですか?

持っているのは理にかなっていますか

CREATE TABLE `CLIENTS` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
# other client fields - address, phone, whatever
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `CLIENTS_OWNERS` (
`CLIENT_ID` int(11) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`CLIENT_ID`,`OWNER_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

500文字の文字列にそのような一意のキーを追加することは本当に避けたいと思います。2つのintに一意性を適用する方がはるかに効率的です。さらに、テーブル内のIDは、実際にはIDを必要とするものを参照する必要があります。あなたのバージョンでは、IDフィールドはクライアントと所有者の関係だけを識別しているように見えますが、これは単なるマッピングであるため、実際には個別のIDは必要ありません。

于 2008-09-18T05:08:01.840 に答える
0

CONSTRAINT ... UNIQUEを見たことがありますか?

于 2008-09-18T04:45:47.977 に答える
-1

ここに。UTF8 文字セットの場合、MySQL は 1 文字あたり最大 3 バイトを使用する場合があります。CLIENT_NAME は 3 x 500 = 1500 バイトです。CLIENT_NAME250 に短縮します。

後で:名前のハッシュを作成し、それをキーとして使用することに+1。

于 2008-09-18T04:49:44.317 に答える