スワップIDは、ストアドプロシージャとtempoparyテーブルで実装する:
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 |
しかし、(アプリケーション)側と唯一の手掛かり(アプリケーションのクライアント上の別のユーザーによって更新され、あなたがswapedてきたIDを想像します更新するrawがIDであることを理解する。それは悪夢だろう。
この手順は、1人のユーザーの使用で100%有効です。
もう一つの方法は、2つの列の間のすべての列の値を(交換)を更新することです:あり
UPDATE targetTable tab1, targetTable tab2 SET tab1.<colX>=tab2.<colX>, tab2.<colX>=tab1.<colX> where tab1.id=<id1> and tab2.id=<id2>;
まだいくつかの同期メカニズムであることが必要です。
@amosriveraありがとう私はちょうどそれをやろうとしていました - ごめんなさい – byronyasgur
あなたは実際にIDを変更したいのですか、時々別の順序でそれを取得したいですか? –
@byronyasgur no prob、ちょうどテキストを選択して、コードフォーマット – amosrivera