私はテーブルを持っています:
table votes (
id,
user,
email,
address,
primary key(id),
);
ここで、ユーザー、メール、アドレスの列を(一緒に) 一意にしたいと考えています。
MySqlでこれを行うにはどうすればよいですか?
もちろん、例は単なる...例です。したがって、セマンティクスについて心配する必要はありません。
私はテーブルを持っています:
table votes (
id,
user,
email,
address,
primary key(id),
);
ここで、ユーザー、メール、アドレスの列を(一緒に) 一意にしたいと考えています。
MySqlでこれを行うにはどうすればよいですか?
もちろん、例は単なる...例です。したがって、セマンティクスについて心配する必要はありません。
一意の制約を追加するには、次の 2 つのコンポーネントを使用する必要があります。
ALTER TABLE
- テーブル スキーマを変更し、
ADD UNIQUE
- 一意の制約を追加します。
その後、次の形式で新しい一意のキーを定義できます'name'('column1', 'column2'...)
したがって、特定の問題については、次のコマンドを使用できます。
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 `my_uniq_id` (`id_box_elements`,`id_router`)
);
UNIQUE KEY は期待どおりに機能し、id_box_elements と id_router の複数の NULL 行を許可します。
私は MySQL 5.1.42 を実行しているので、おそらく上記の問題に関する更新があったのでしょう。幸いなことにそれは機能し、うまくいけば、そのままになるでしょう。
行に NULL 値がある場合、MySQL では NULL を一意の値として扱い、少なくとも現在は複数列のインデックスでそれを回避するロジックがないため、複数列の一意のインデックスは MySQL では機能しません。はい、複数列インデックスの多くの正当なアプリケーションを制限するため、動作は正気ではありませんが、それはそれです..バグトラック...
これを試しましたか?
UNIQUE KEY `thekey` (`user`,`email`,`address`)
MySql 5 以降は次のように動作します (テストしたばかりです)。
例: PRODUCT_NAME, PRODUCT_VERSION 'グラス', null 'グラス', null 'ワイン', 1
('wine' 1) をもう一度挿入しようとすると、制約違反が報告されます
phpMyAdminを使用して、複数列の一意のインデックスを追加できます。(バージョン 4.0.4 でテストしました)
ターゲット テーブルの構造ページに移動します。列の 1 つに一意のインデックスを追加します。構造ページの下部にある [インデックス] リストを展開して、追加した一意のインデックスを確認します。編集アイコンをクリックすると、次のダイアログで、その一意のインデックスに列を追加できます。
一意のインデックスを追加するには、次が必要です。
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`);
将来的に重複を避けたい場合。id2 などの別の列を作成します。
UPDATE tablename SET id2 = id;
次に、2 つの列に一意を追加します。
alter table tablename add unique index(columnname, id2);