Как изменить значение уникального индекса - PullRequest
0 голосов
/ 04 апреля 2019
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 в eg. диапазон (idx> 1 и idx <9) </p>

но из-за УНИКАЛЬНОГО КЛЮЧА idx_age_gender_deleteflag У меня ошибка

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

Я хочу знать, как лучше использовать idx = id-1 или idx = id + 1

1 Ответ

0 голосов
/ 04 апреля 2019

Три метода - предпочтителен метод 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 , где условие WHEN истинно , иначе это будетпросто скопируйте значение.Все строки будут обновлены.

Затем удалите столбец idx и переименуйте новый столбец.Индексы нужно будет перестроить.


3) Отключить ваш уникальный статус вашего индекса.

Внесите изменения

Включите уникальный статус вашего индекса.

...