2016-11-22 4 views
4

私の問題はかなり単純ですが、私はそれに単語を置くことはできません。 私はそれぞれのIDを持つユーザーテーブルを持っています。タプルをSQLテーブルで一意にするにはどうすればいいですか?

友情テーブルを作りたいと思いますが、重複したレコードを持つことはできません。意味がない:

id_user1 | id_user2 
---------|---------- 
    2  | 3 
    3  | 2 

私は十分にクリアですか?

CREATE TABLE User(
    id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    surname VARCHAR(100) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE Friends(
    id_user1 INT NOT NULL, 
    id_user2 INT NOT NULL, 
    PRIMARY KEY(id_user1, id_user2), 
    FOREIGN KEY (id_user1) REFERENCES User(id), 
    FOREIGN KEY (id_user2) REFERENCES User(id), 
); 

[EDIT 1:] たぶんベストプラクティスは二回、各レコードを保存することです、私は私のテーブルの作成のためにこれを持っている瞬間のために

?両方?

+0

の可能性のある重複した[?私はMySQLで複数の列に一意の制約を指定する方法](http://stackoverflow.com/questions/635937/how -do-i-specified-unique-constraint-multiple-columns-in-mysql) – Richard

+0

いいえ、UNIQUE制約は何も変更しません... – ypicard

+0

私はあなたがそのような制約をテーブル自体に定義できるとは思いません。 1つの可能な回避策はUNIQUE(id_user1、id_user2)を設定し、常にid_user1に小さなidを、id_user2に大きなidを保存することです。 – jussius

答えて

0

SQL言語に関する限り、CHECKという制約があります。これは、外部キーや一意性などの単純で定義された制約の1つではない値に対する制限です。

しかし、私はmysqlを尊敬しているとは思わないCHECKという制約があります。私が見た通常のアドバイスは、挿入や更新があなたの状態に違反しようとすると例外をスローするトリガを使うことです。

1

トリガーで重複のチェックを行うことはできますが、できるだけ確実に確認することが重要です。低い値のidはid_user1に、もう1つはid_user2に移動します。あなたのアプリケーションで、またはトリガの助けを借りて行うことができます。あなたは、あなたのテーブルに主キー制約を作成して:

DROP TRIGGER IF EXISTS yourtable_bi; 

delimiter // 

CREATE TRIGGER yourtable_bi 
before insert on yourtable 
for each row 
begin 
declare x int; 
if (new.id_user1>new.id_user2) 
then 
set x:=NEW.id_user1; 
set NEW.id_user1:=NEW.id_user2; 
set NEW.id_user2:=x; 
end if; 
end// 
delimiter ; 

だから、あなたは

insert into yourtable values (2,1); 

をしようとした場合、その後

​​

後に、それは同じレコードを挿入しようとすると、失敗します主キーの制約のためです。

テーブルで許可されている場合は、更新することもできます。

0

あなたは(LEAST(id1,id2), GREATEST(id1,id2))にユニーク制約を置くことができます。

CREATE TABLE friends (
    id1 INT, 
    id2 INT, 
    min_id INT AS (LEAST(id1,id2)) VIRTUAL, 
    max_id INT AS (GREATEST(id1,id2)) VIRTUAL, 
    UNIQUE KEY (min_id,max_id) 
); 
+0

これは良い方法ですが、コードを実行するときにSQL構文エラーが発生します。私はそれがどこにあるのか、何かヒントを見つけることができませんか? – ypicard

+0

@ypicard:あなたはMySQLの古いバージョンを使用していると思います。 [docs](https:// dev。mysql.com/doc/refman/5.7/en/create-table-generated-columns.html)、これは5.7.8以降でのみ動作します。 5.7.6と5.7.7では、 'VIRTUAL'を' STORED'に変更するとうまくいくはずです。それ以前のものは、これらの列にトリガーを入力する必要があります。 –

+0

5.7.12のデモンストレーションはこちら:http://rextester.com/LABKL51047 –

関連する問題