如何修改唯一索引的值

时间:2019-04-04 07:51:11

标签: mysql indexing unique

CREATE TABLE `entityfeedhot` (
  `efhid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `idx` int(10) unsigned NOT NULL COMMENT 'order num',
  `age` int(10) unsigned NOT NULL COMMENT '',
  `gender` tinyint(4) unsigned NOT NULL COMMENT ',1:man,2:famal',
  `deleteflag` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '',
  PRIMARY KEY (`efhid`),
  UNIQUE KEY `idx_age_gender_deleteflag` (`idx`,`age`,`gender`,`deleteflag`),
  KEY `efid` (`efid`)
) ENGINE=InnoDB AUTO_INCREMENT=916 DEFAULT CHARSET=utf8 ;

现在我想在例如中使idx = idx-1。范围(idx> 1 AND idx <9)

但是由于UNIQUE KEY idx_age_gender_deleteflag,我出错了

 Duplicate entry '4-0-1-0' for key 'idx_age_gender_deleteflag'

我想知道让idx = id-1或idx = id + 1的最佳方法

1 个答案:

答案 0 :(得分:0)

三种方法-首选方法1:

1)循环浏览每个条目,并从该条目的值中删除1,从最低值开始依次递增。

UPDATE `entityfeedhot` SET `idx` = `idx` - 1 WHERE `idx` > 1 AND `idx` < 9 ORDER BY `idx` ASC

ORDER BY条款很重要,因为它确保行以升序处理,以避免结果重复。 idx = 1不应该存在。


2)创建一个新列,例如idx_two并将此列值设置为等于idx-1。这将否定索引的唯一状态(因为它是新列)。

ALTER TABLE `entityfeedhot` ADD `new_dx` INT(10) NOT NULL DEFAULT '0' AFTER `idx`;

然后填充列:

UPDATE `entityfeedhot` SET `new_dx` = CASE
WHEN  `idx` > 1 AND `idx` < 9 THEN `idx` = `idx` - 1
ELSE `idx`

上面的查询将使用idx-1 where the WHEN condition is true进行填充,否则将仅复制该值。所有行将被更新。

然后删除idx列并重命名新列。 Indx将需要重建。


3)关闭索引的唯一状态。

进行更改

重新打开索引的唯一状态。