Переключить номера идентификаторов двух строк в MySql - PullRequest
9 голосов
/ 09 июля 2011

Я пытаюсь переключить идентификаторы двух строк в MySQL, используя php - чем больше я читаю об этом, тем больше путаюсь.Кажется, есть много противоречивой информации.Кто-нибудь получил окончательный ответ.

например, в начальном состоянии мои строки

1-Peter-22-germany
2-mary-16-iceland
3-tom-29-france
4-michael-34-greece

, а затем я хотел бы поменять местами идентификаторы строк 2 и 3, чтобы это выглядело так

1-Peter-22-germany
3-mary-16-iceland
2-tom-29-france
4-michael-34-greece

так что если бы я тогда заказал его по id, у меня было бы

1-Peter-22-germany
2-tom-29-france
3-mary-16-iceland
4-michael-34-greece

Ответы [ 5 ]

12 голосов
/ 09 июля 2011
UPDATE yourtable SET id=IF(id=2, 3, 2) where id in(2,3)

может помочь, но это плохая идея - манипулирование / переназначение значений первичного ключа никогда не будет хорошей идеей.

Если это не удается, то это из-за нарушения дублирующего ключа (скорее всего), и вам нужно временно переназначить один из идентификаторов на что-то совершенно другое уникальное значение, чтобы не возникало конфликта, пока переназначение выполняется - для этого потребуется использовать как минимум два запроса.

11 голосов
/ 09 июля 2011

Если идентификатор является первичным ключом, то вы не хотите его менять / иметь возможность его изменить. Если это только для сортировки, я бы предложил сделать столбец "порядок" целое число и сортировка по этому. Схему таблицы было бы неплохо увидеть, но это моя рекомендация.

Если идентификатор создается автоматически при вводе строк, тогда эта идея представляет собой еще большую проблему. Однако сейчас я просто размышляю, поскольку не знаю схемы вашей таблицы.

Вот несколько стандартных советов по первичным ключам: Не думайте о них как о чем-либо, кроме уникального идентификатора.

1 голос
/ 09 июля 2011

Мне не терпится узнать, зачем тебе это нужно, чтобы быть постоянным.Единственное, о чем я могу думать, это чтобы вы могли изменить кажущуюся последовательность событий.

, как говорили другие, идентификаторы, как правило, являются первичными ключами и имеют автоматическую нумерацию, что затрудняет, но является очевидным способом достиженияэто для того, чтобы собрать все данные поля из двух элементов в массив и ОБНОВИТЬ каждую запись со значениями из другой.

0 голосов
/ 02 июня 2013

Идентификаторы обмена относительно легко реализовать с помощью хранимой процедуры и временной таблицы:

CREATE PROCEDURE `swapIDs`(aTable varchar(64),aID1 int(11),aID2 int(11))
BEGIN
 drop temporary table if exists swapIDsTable;
 SET @s = concat('create temporary table swapIDsTable like ',aTable); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
 SET @s = concat('insert into swapIDsTable select * from ',aTable,' where id=',aID1);  PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
 SET @s = concat('delete from ', aTable, ' where id=',aID1); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
 SET @s = concat('update ', aTable, ' set id=',aID1,' where id=',aID2); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
 SET @s = concat('update swapIDsTable set id=',aID2,' where id=',aID1); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
 SET @s = concat('insert into ', aTable,' select * from swapIDsTable where id=',aID2); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
 drop temporary table if exists swapIDsTable;
END |

Но представьте, что вы поменяли идентификаторы, которые обновляются другим пользователем на стороне клиента (приложения), и только подсказку (для приложения), чтобы понять, какой необработанный файл для обновления является идентификатором. Это было бы кошмаром.

Таким образом, эта процедура может быть на 100% полезной только для одного пользователя.

Другой способ - обновить (обменять) все значения столбцов между двумя строками:

UPDATE targetTable tab1, targetTable tab2 SET tab1.<colX>=tab2.<colX>, tab2.<colX>=tab1.<colX>  where tab1.id=<id1> and tab2.id=<id2>;

Еще должен быть какой-то механизм синхронизации.

0 голосов
/ 09 июля 2011

Вам нужно SORT BY что-то. Нам нужно увидеть схему вашей таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...