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的最佳方法
答案 0 :(得分:0)
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)关闭索引的唯一状态。
进行更改
重新打开索引的唯一状态。