980

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

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

ここで、ユーザー、メール、アドレスの列を(一緒に) 一意にしたいと考えています。

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

もちろん、例は単なる...例です。したがって、セマンティクスについて心配する必要はありません。

4

14 に答える 14

1611

一意の制約を追加するには、次の 2 つのコンポーネントを使用する必要があります。

ALTER TABLE- テーブル スキーマを変更し、

ADD UNIQUE- 一意の制約を追加します。

その後、次の形式で新しい一意のキーを定義できます'name'('column1', 'column2'...)

したがって、特定の問題については、次のコマンドを使用できます。

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
于 2009-03-11T19:14:20.480 に答える
281

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

于 2010-08-09T14:56:16.230 に答える
60

行に NULL 値がある場合、MySQL では NULL を一意の値として扱い、少なくとも現在は複数列のインデックスでそれを回避するロジックがないため、複数列の一意のインデックスは MySQL では機能しません。はい、複数列インデックスの多くの正当なアプリケーションを制限するため、動作は正気ではありませんが、それはそれです..バグトラック...

于 2010-05-07T21:21:31.563 に答える
25

これを試しましたか?

UNIQUE KEY `thekey` (`user`,`email`,`address`)
于 2009-03-11T19:14:24.537 に答える
7

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

  • null 許容列を含む一意の制約を定義できます。A が nullable ではなく、B が nullable である制約 unique (A, B) を定義するとします。
  • このような制約を評価するときは、 (A, null) を何度でも持つことができます (同じ A 値!)
  • 1つの(A、null Bではない)ペアのみを持つことができます

例: PRODUCT_NAME, PRODUCT_VERSION 'グラス', null 'グラス', null 'ワイン', 1

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

于 2014-08-03T12:56:47.940 に答える
6

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

ターゲット テーブルの構造ページに移動します。列の 1 つに一意のインデックスを追加します。構造ページの下部にある [インデックス] リストを展開して、追加した一意のインデックスを確認します編集アイコンをクリックすると、次のダイアログで、その一意のインデックスに列を追加できます。

于 2014-03-20T00:40:34.417 に答える
3

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

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`);
于 2014-07-10T08:22:41.810 に答える
2

将来的に重複を避けたい場合。id2 などの別の列を作成します。

UPDATE tablename SET id2 = id;

次に、2 つの列に一意を追加します。

alter table tablename add unique index(columnname, id2);
于 2013-03-09T13:04:54.030 に答える