追加 - unique key mysql multiple columns




MySQLの複数の列に対して一意制約を指定するにはどうすればよいですか? (8)

私にはテーブルがあります:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

今、私は列のユーザー、電子メール、アドレスを一意(一緒に)にしたい。

MySqlでこれを行うにはどうすればいいですか?

  • もちろん、その例は単なる例です。 だからセマンティクスについて心配しないでください。

MySQLがNULLを一意の値として扱い、少なくとも現在複数の列のインデックスでそれを回避するロジックがないため、複数の列の一意のインデックスは、行内にNULL値を持つ場合、MySQLでは機能しません。 はい、動作は狂っています。なぜなら、それはマルチカラムインデックスの正当なアプリケーションをたくさん制限しているのですが、それはそれです...まだ、MySQL上で "修正されません"と刻印されたバグですバグトラック...


MySql 5以上は次のように動作します(私はテストしました):

  • ヌル可能な列を含む固有の制約を定義できます。 一意の制約(A、B)を定義するとします。ここで、AはnullableではなくBは
  • そのような制約を評価する場合、あなたは(A、null)をあなたが望む回数(同じAの値!)にすることができます。
  • 1つ(A、nullでないB)のペア

例:PRODUCT_NAME、PRODUCT_VERSION 'glass'、null 'glass'、null 'wine'、1

今度は( 'wine' 1)をもう一度挿入しようとすると、制約違反が報告されます


あなたが将来重複を避けたい場合。 id2という別の列を作成します。

UPDATE tablename SET id2 = id;

次に、2つの列にユニークを追加します。

alter table tablename add unique index(columnname, id2);

あなたはこれを試しましたか?

UNIQUE KEY `thekey` (`user`,`email`,`address`)

ユニークなインデックスを追加するには以下が必要です:

1)table_name
2)index_name
3)インデックスを追加する列

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

あなたの場合、次のようにユニークなインデックスを作成することができます:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);

私はMySQLのテーブルがあります:

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

UNIQUE KEYは期待通りに機能し、id_box_elementsとid_routerの複数のNULL行を許可します。

私はMySQL 5.1.42を実行しているので、おそらく上記の問題に関するいくつかの更新がありました。 幸いにも、それはうまくいけばうまくいけばそれはそのままになります。


複数列のユニークなインデックスをphpMyAdmin経由で追加することができます。 (バージョン4.0.4でテストしました)

ターゲット表の構造ページにナビゲートします。 列の1つに一意のインデックスを追加します。 構造ページの下部にある「 索引」リストを展開して、追加したばかりの索引を表示します。 編集アイコンをクリックし、次のダイアログでそのユニークなインデックスに列を追加することができます。


ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);




database-table