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

Jak*_*son 10 mysql uniqueidentifier insert unique-constraint

看看下面的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) ;
Run Code Online (Sandbox Code Playgroud)

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

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

因此,举例来说,如果我试图插入一个接触的是有network_id = 4network_contact_id = 12中,INSERT IGNORE查询将看到该条目已经存在,而忽略被抛出任何错误。

所以基本上,network_id不是唯一的。network_contact_id不是唯一的。但两者的结合是独一无二的。我该如何设置?我是否必须有一个其他字段作为其他两个字段的串联值?或者有没有办法为此表设置密钥,以便它可以满足我的需要?

Der*_*ney 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`)
);
Run Code Online (Sandbox Code Playgroud)

  • OMG 您的答案和@ypercube 的时间戳都相同。+1 给你们俩。 (2认同)

ype*_*eᵀᴹ 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)
    );
Run Code Online (Sandbox Code Playgroud)

您还应该检查 Bill Karwin 关于INSERT IGNORE,REPLACEINSERT ... ON DUPLICATE KEY UPDATE

  • 这只是为约束提供一个名称。如果我没记错的话,在 DTest 答案中,约束将由 MySQL 自动命名。 (4认同)