Я пытаюсь переключить идентификатор двух строк в 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 i,
1-Peter-22-germany 2-tom-29-france 3-mary-16-iceland 4-michael-34-greece
Если идентификатор является первичным ключом, вы не хотите его изменять / иметь возможность изменить. Если это только для сортировки, я бы предложил создать столбец «порядок», который является целым числом и будет сортироваться по нему. Табличная схема была бы неплохо увидеть, но это моя рекомендация.
Если идентификатор создается автоматически при вводе строк, эта идея представляет собой еще большую проблему. Однако теперь я просто размышляю, так как не знаю вашу схему таблиц.
Вот несколько стандартных советов по первичным ключам: не думайте о них как о чем-либо, кроме уникального идентификатора.
UPDATE yourtable SET id=IF(id=2, 3, 2) where id in(2,3)
может сделать трюк, но это плохая идея – манипулирование / переназначение значений первичного ключа никогда не является хорошей идеей.
Если это не удается, то это из-за двойного нарушения ключа (скорее всего), и вам нужно временно переназначить один из идентификаторов на что-то совершенно другое уникальное значение, чтобы вы не столкнулись с конфликтом, пока выполняется переназначение – это потребует, чтобы вы использовали по крайней мере два запроса.
Я умираю, чтобы понять, почему вам нужно, чтобы он был постоянным. Единственное, что я могу придумать, это то, что вы можете изменить кажущуюся последовательность событий.
как указывали другие, идентификаторы обычно являются первичными ключами и автоматически пронумерованы, поэтому это затрудняет, но очевидный способ достичь этого состоит в том, чтобы собрать все данные полей из двух элементов в массив и ОБНОВИТЬ каждую запись с помощью VALUES из другой.
Вам нужно SORT BY
что-то. Нам нужно увидеть вашу схему таблиц.
Своп-идентификаторы относительно просты в реализации с хранимой процедурой и таблицей темпопартов:
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 |
Но представьте себе, что вы изменили идентификатор, который обновляется другим пользователем на стороне клиента (приложения) и только ключ (для приложения), чтобы понять, какой raw для обновления является ID. Это был бы кошмар.
Таким образом, эта процедура может быть на 100% полезной при использовании только одного пользователя.
Другой способ – обновить (обменять) все значения столбцов между двумя строками:
UPDATE targetTable tab1, targetTable tab2 SET tab1.<colX>=tab2.<colX>, tab2.<colX>=tab1.<colX> where tab1.id=<id1> and tab2.id=<id2>;
Существует еще некоторый механизм синхронизации.