web-dev-qa-db-ja.com

テーブルフィールドの組み合わせを介してユニークキーを使用するにはどうすればよいですか?

次のsqlfiddleを見てください。 http://sqlfiddle.com/#!2/dacb5/1

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int
    );

INSERT INTO contacts
(name, network_id, network_contact_id)
VALUES
('John', 4, 10),
('Alex', 4, 11),
('Bob', 4, 12),
('Jeff', 4, 45),
('Bill', 7, 11),
('Walter', 7, 45),
('Jessie', 7, 360) ;

連絡先の基本的な表があります。 network_idおよびnetwork_contact_idフィールドには、他のテーブルにリンクするID番号が含まれています。

このテーブルに対してINSERT IGNOREクエリを実行できるようにしたいのですが、network_idnetwork_contact_idの組み合わせを、照合する一意のキーとして使用したいと思います。

たとえば、network_id = 4network_contact_id = 12が含まれる連絡先を挿入しようとすると、INSERT IGNOREクエリはそのエントリがすでに存在することを確認し、スローされたエラーを無視します。

したがって、基本的に、network_idは一意ではありません。 network_contact_idは一意ではありません。しかし、この2つの組み合わせは独特です。これをどのように設定しますか?他の2つのフィールドを連結した値である他の1つのフィールドが必要ですか?または、このテーブルのキーを設定して、必要なことを行う方法はありますか?

9
Jake Wilson

試しましたか

CREATE TABLE contacts (
 id int auto_increment primary key, 
 name varchar(20), 
 network_id int,
 network_contact_id int, 
 UNIQUE KEY (`network_id`, `network_contact_id`)
);
9
Derek Downey

2つの列の組み合わせにUNIQUE KEY制約を追加して、テーブルの定義を変更します。

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int,
     CONSTRAINT network_id_contact_id_UNIQUE
       UNIQUE KEY (network_id, network_contact_id)
    );

INSERT IGNOREREPLACEINSERT ... ON DUPLICATE KEY UPDATE の違いについて、Bill Karwinによるこの回答も確認してください。

6
ypercubeᵀᴹ