web-dev-qa-db-ja.com

MySQLで複数の列に一意の制約を指定する方法

私はテーブルを持っています:

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

今度は、列 ユーザー、電子メール、アドレス を(一緒に)一意にします。

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

  • もちろん、この例は単なる例です。それで、意味論を心配しないでください。
795
Niyaz
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
1306
jonstjohn

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を実行しているので、おそらく上で議論した問題に関するいくつかの更新がありました。幸いなことにそれは機能し、うまくいけばそれはそのようにとどまるでしょう。

208
Frodik

MySQLがNULLをユニークな値として扱い、少なくとも現在マルチカラムインデックスでそれを回避するためのロジックを持っていないので、rowにNULL値がある場合、マルチカラムユニークインデックスはMySQLでは機能しません。マルチカラムインデックスの正当なアプリケーションの多くを制限するので、その振る舞いは正当ではありませんが、それはまさにその通りです...それでも、MySQLには「修正しない」というスタンプが付けられたバグですバグ追跡...

45
niksoft

これを試しましたか?

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

これはmysqlバージョン5.5.32で動作します

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
11
rizon

phpMyAdmin を使用して、複数列の一意のインデックスを追加できます。 (私はバージョン4.0.4でテストしました)

ターゲットテーブルの structure ページに移動します。いずれかの列に一意のインデックスを追加してください。構造ページの下部にある Indexes リストを展開して、追加したばかりの一意のインデックスを確認します。編集アイコンをクリックすると、次のダイアログでそのユニークインデックスに列を追加することができます。

6
Vince K

MySql 5以降はこのように動作します(私はテストしたばかりです)。

  • nULL可能列を含む固有の制約を定義できます。 AがNULL値ではないがBがNULLであるという制約の一意性(A、B)を定義したとします。
  • そのような制約を評価するとき、あなたは何度でも(A、null)を持つことができます(同じA値!)
  • ペアは1つだけ(A、null Bは不可)

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

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

5
Cristian Botiza

私はこのようにします:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

私のユニークなindex_nameの慣習はTableName_Column1_Column2_Column3_uindexです。

2
Sam Malayek

一意のインデックスを追加するには、以下が必要です。

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`);
1
sandeep vanama

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

UPDATE tablename SET id2 = id;

それでは、2つの列にユニークを追加します。

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

Mysqlでテーブルを作成している場合は、以下を使用してください。

create table package_template_mapping (
mapping_id  int(10) not null auto_increment  ,
template_id int(10) NOT NULL ,
package_id  int(10) NOT NULL ,
remark      varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);
0