一次性重新映射表中的数字

时间:2014-09-25 21:35:07

标签: mysql

我正在将数据库结构转换为另一个数据库结构。 ID有这个问题。用于通过ID引用彼此的项目 - 但这些ID 必须更改,因为新结构不同。

所以你有一张桌子(这是一个例子):

 | id | ref |
 +----+-----+
 |  1 |   3 |
 |  2 |   1 |
 |  3 |   1 |
 |  4 |   2 |

现在让我们说在新表中,ref费用ID必须改变如下:

 | old | new |
 +-----+-----+
 |  1  |  2  |
 |  2  |  1  |
 |  3  |  4  |
 |  4  |  3  |

如果您随后UPDATE将新的ref替换为新的Replacing: 1=>2 Replacing: 2=>1 This is what we need at the end: well, damn | id | ref | | id | ref | | id | ref | +----+-----+ +----+-----+ +----+-----+ | 1 | 3 | | 1 | 3 | | 1 | 4 | | 2 | *2* | | 2 | 2 | | 2 | 2 | | 3 | *2* | | 3 | 2 | | 2 | 2 | | 4 | 2 | | 4 | *2* | | 2 | 1 | ,请看看会发生什么:

{{1}}

所以我需要一次更换它。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

此更新全部在一条指令中

UPDATE t1 a
INNER JOIN  t2 b
 ON a.ref=b.old
SET a.ref=b.new;

结果

select * from t1

id  ref
1   4
2   2
3   2
4   1

http://sqlfiddle.com/#!2/ab49c/1

架构和数据样本

create table t1 (id int, ref int);
create table t2 (old int, new int);

insert t1 values(1,3);
insert t1 values(2,1);
insert t1 values(3,1);
insert t1 values(4,2);

insert t2 values(1,2);
insert t2 values(2,1);
insert t2 values(3,4);
insert t2 values(4,3);

答案 1 :(得分:0)

由于标准无关紧要,因此可以解决问题。解决方案的核心是:一次更新所有行。

update YourTable
set ref = 
    case ref
        when 1 then 2
        when 2 then 1
        when 3 then 4
        when 4 then 3
    end

如果不可能:

  • 添加新列'newref'
  • 以任何方式更新'newref'以包含新ID
  • 使用'newref'
  • 中的值更新'ref'列
  • 放弃'newref'