MySQLの複数の列に一意の制約を指定するにはどうすればよいですか?
-
10-07-2019 - |
質問
テーブルがあります:
table votes (
id,
user,
email,
address,
primary key(id),
);
列を user、email、address を一意に(一緒に)したいです。
MySqlでこれを行うにはどうすればよいですか
- もちろん、例は単なる...例です。そのため、セマンティクスについて心配しないでください。
解決
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`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を実行しているので、おそらく上記の問題について何らかの更新があったでしょう。幸いにも機能し、うまくいけばそのままになります。
MySQLはNULLを一意の値として扱い、少なくとも現在、複数列のインデックスでそれを回避するロジックがないため、行にNULL値がある場合、MySQLでは複数列の一意のインデックスは機能しません。はい、複数列インデックスの正当なアプリケーションの多くを制限するため、動作は異常です。しかし、それはそうです...現時点では、「修正しない」とスタンプされたバグです。 MySQLバグ追跡...
これを試しましたか?
UNIQUE KEY `thekey` (`user`,`email`,`address`)
これはmysqlバージョン5.5.32で機能します
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
phpMyAdmin を使用して、複数列の一意のインデックスを追加できます。 (バージョン4.0.4でテストしました)
ターゲットテーブルの構造ページに移動します。列の1つに一意のインデックスを追加します。構造ページの下部にある[インデックス]リストを展開して、追加した一意のインデックスを表示します。編集アイコンをクリックすると、次のダイアログでその一意のインデックスに列を追加できます。
MySql 5以降は次のように動作します(テストしたばかりです):
- null許容列を含む一意制約を定義できます。制約一意(A、B)を定義するとします。ここで、AはNULL不可ですが、Bは
- そのような制約を評価する場合、必要な回数(A、null)持つことができます(同じA値!)
- 1つ(A、null B以外)のペアしか持てません
例: PRODUCT_NAME、PRODUCT_VERSION 「ガラス」、null 「ガラス」、null 「ワイン」、1
(「ワイン」1)をもう一度挿入しようとすると、制約違反が報告されます これがお役に立てば幸いです
このようにします:
CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
一意の index_name
の慣例は TableName_Column1_Column2_Column3_uindex
です。
将来的に重複を避けたい場合。 id2という別の列を作成します。
UPDATE tablename SET id2 = id;
2つの列に一意を追加します:
alter table tablename add unique index(columnname, id2);
一意のインデックスを追加するには、以下が必要です:
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 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)
);