如何通过表字段的组合使用唯一键?


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

我有一个基本的联系表。该network_idnetwork_contact_id字段包含链接到其他表的ID号码。

我希望能够运行INSERT IGNORE查询,此表,但我想用的组合network_id,并network_contact_id作为唯一键来匹配。

因此,例如,如果我尝试插入具有network_id = 4和的联系人network_contact_id = 12,则INSERT IGNORE查询将看到该条目已存在,并忽略引发的任何错误。

所以基本上,network_id不是唯一的。network_contact_id不是唯一的。但是两者的结合是独特的。我该如何设置?我是否需要一个其他字段作为其他两个字段的串联值?还是有一种方法可以为此表设置键,以便它可以执行我需要的操作?

Answers:


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
@Rolando:其实DTEST增快1秒:)
ypercubeᵀᴹ

6

通过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)
    );

您还应该检查Bill Karwin关于之间的区别的答案。INSERT IGNOREREPLACEINSERT ... ON DUPLICATE KEY UPDATE


1
当DTest没有定义时,为什么定义在那里有约束?有什么区别?
杰克·威尔逊

4
这只是为约束提供名称。如果我没有记错的话,用DTest回答,约束将由MySQL自动命名。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.