mysql 复合 唯一 索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 复合 唯一 索引相关的知识,希望对你有一定的参考价值。

怎么避免插入相同的复合数据 ? 例:

id = 1, key_word = '汽车', data_id = 12345,
id = 2, key_word = '汽车', data_id = 54321,
id = 3, key_word = '汽车', data_id = 12345,

我想要的结果是:
当第 3 条数据插入的时候, 跳过当前插入. 因为与第 3 条数据与第 1 条数据重复了
key_word 与 data_id看成是一条复合数据, 不能出现重复的值

我创建了一个复合唯一索引(倒数第二排), 但是没有效果, 插入数据的时候同样可以插入相同的数据:
INSERT INTO `key_words`
(key_word, data_id) values
('飞机', 54321),
('汽车', 12345),
('汽车', 54321);

是我操作不当么?? 该怎么插入数据呢??

CREATE TABLE IF NOT EXISTS `key_words` (
`id` int unsigned PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key_word` varchar(40) NOT NULL comment '关键字',
`data_id` int unsigned NOT NULL comment '数据id',
KEY `key_word` (`key_word`),
UNIQUE INDEX `key_word` (`key_word`, `data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
自己解决了:

CREATE TABLE IF NOT EXISTS `key_words` (
`id` int unsigned PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key_word` varchar(40) NOT NULL comment '关键字',
`data_id` int unsigned NOT NULL comment '数据id',
KEY `key_word` (`key_word`),
UNIQUE INDEX (`key_word`, `data_id`) //修改的地方
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

插入用:

INSERT IGNORE INTO ...

参考技术A INSERT INTO `key_words` 
(key_word,data_id)   values 
('飞机',54321), 
('汽车',12345), 
('汽车',54321);

改成下面这个 肯定就不能插入了
INSERT INTO `key_words` 
(key_word,data_id)   values 
('飞机',54321), 
('汽车',12345), 
('飞机',54321);

追问

我的意思是插入的时候不能与数据库中的值重复, 你写的这个是不可能出现的情况

以上是关于mysql 复合 唯一 索引的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 索引分析

MySQL 在添加新的复合索引时是不是会在表上获得锁?

MySQL 索引

MongoDB - 唯一索引与复合索引

mysql的联合主键与复合主键区别

复合主键?还是具有唯一复合索引的自动增量主键? [关闭]