回答:
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`)
);
一意キーは期待どおりに機能し、id_box_elementsとid_routerの複数のNULL行を許可します。
私はMySQL 5.1.42を実行しているので、おそらく上記の問題にいくつかの更新がありました。幸いなことにそれは機能し、うまくいけばそれはそのようにとどまるでしょう。
MySQLはNULLを一意の値として扱い、少なくとも現在は複数列のインデックスでそれを回避するロジックがないため、行にNULL値がある場合、複数列の一意のインデックスは機能しません。はい、マルチカラムインデックスの多くの正当なアプリケーションを制限するため、動作は正気ではありません。バグ追跡...
ENGINE BDB
、2)これは文書化された動作ですが、IMHOは驚くべき/不愉快である可能性があるため、十分に文書化されていません。議論については、MySQLバグ25544 bugs.mysql.com/bug.php?id=25544を参照してください。
これはmysqlバージョン5.5.32で機能します
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
MySql 5以降は次のように動作します(テストしたばかりです)。
例:PRODUCT_NAME、PRODUCT_VERSION 'グラス'、null 'グラス'、null 'ワイン'、1
今度は( 'wine' 1)を再度挿入しようとすると、制約違反が報告されます。
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)
);
最初に既存の重複を取り除きます
delete a from votes as a, votes as b where a.id < b.id
and a.user <=> b.user and a.email <=> b.email
and a.address <=> b.address;
次に、一意の制約を追加します
ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);
制約を確認します
SHOW CREATE TABLE votes;
ユーザー、電子メール、アドレスのいずれかにnull値が含まれている場合、それらは一意と見なされることに注意してください。