mysql转换表模式,同时将数据保留在新结构中(您见过的最佳模式)

l5tcr1uw  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(343)

我正在分叉一个项目,希望将其中一个表模式转换为一个更。。可行结构
目前:

steamid | mapname | cp1 | cp2 | cp3 | cp4 | cp5 | cp6 | cp7 | cp8 | cp9 | cp10 | cp 11 | cp12 | cp13 | cp14 | cp15 | cp16 | cp17 | cp18 | cp19 | cp20 | cp21  | cp22 | cp23 | cp24 | cp25 | cp26 | cp27 | cp28 | cp29 | cp30 | cp31 | cp32 | cp33 | cp34 | cp35 | zonegroup

steamid是用户id,mapname是Map,cp列存储特定检查点的玩家时间,zonegroup存储Map的“stage”
我想把它改成:

steamid | mapname | cp | time | zonegroup

有没有什么切实可行的解决方案来转换这个表,同时保留数据,从而将以前存储在cp1中的时间移动到新的cp列,该列的值为1,新的time列将包含旧cp1列中的任何内容
谢谢!

uhry853o

uhry853o1#

您可以将数据传输到一个新的表中,但需要很长的时间 INSERT ... SELECT 查询:

INSERT INTO new_table (steamid, mapname, cp, time, zonegroup)
SELECT * FROM (
    SELECT steamid, mapname, 1 AS cp, cp1 AS time, zonegroup FROM old_table
    UNION ALL
    SELECT steamid, mapname, 2, cp2, zonegroup FROM old_table
    UNION ALL
    ...
    SELECT steamid, mapname, 35, cp35, zonegroup FROM old_table) v
yeotifhr

yeotifhr2#

你需要(一大群)联合

select steamid, mapname, cp1 as cp , now(), zonegroup 
    from my_table  
    where cp1 is not null
    union all
    select steamid, mapname, cp2 , now(), zonegroup 
    from my_table  
    where cp2 is not null
    union all
    select steamid, mapname, cp3 , now(), zonegroup 
    from my_table  
    where cp3 is not null
    .....
    .....
    .....
    select steamid, mapname, cp34 , now(), zonegroup 
    from my_table  
    where cp34 is not null
    select steamid, mapname, cp35 , now(), zonegroup 
    from my_table  
    where cp35 is not null

相关问题