テーブルフィールドの組み合わせを介して一意のキーを使用する方法


9

次の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) ;

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

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

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

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

回答:


9

試しましたか

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`)
);

2
OMG回答と@ypercubeのタイムスタンプは同じです。両方の+1。
RolandoMySQLDBA

1
idこれunique keyが設定されている場合、フィールドを主キーとして保持する理由はありますか?
ジェイクウィルソン

1
idフィールドを保持することに関する問題の1つを次に示します。
デレクダウニー、

1
@Rolando:実際DTESTは1秒:)で速かった
ypercubeᵀᴹ

6

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

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


1
DTestにはないのに、定義に制約があるのはなぜですか?違いはなんですか?
ジェイクウィルソン

4
これは制約の名前のみを提供しています。私がよく覚えている場合、DTestの回答を使用すると、MySQLによって制約に自動的に名前が付けられます。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.