代码之家  ›  专栏  ›  技术社区  ›  Matthew Jones

SQL重构-唯一标识符的唯一名称

  •  0
  • Matthew Jones  · 技术社区  · 15 年前

    我正在重构我的数据库以支持对我们基于Web的工具的升级。

    假设我有四个表:里程碑、类别、技能和工资。在旧模式下,这些表中的每个表只列出了一个名称,该名称是表的键。

    在新的模式下,每个表不仅有一个名称,而且还有一个生成的唯一标识符,作为表的键。

    现在,还可以想象我有一个表任务,其中每个任务由一个名称、一个里程碑、一个类别、一个技能和一个工资率组成,并且每个任务都是从各自的表中选择的。在旧模式下,此表只存储名称。在新模式下,此表将存储四个表的ID,而不是名称,如下所示:

    TaskID  TaskName  MilestoneID  CategoryID  SkillID  RateID
    

    其中taskid是为该任务生成的唯一标识符。

    这些表中的每个表当前都包含需要从旧架构传输到新架构的数据。我可以假定任务的四个组件中的每个组件的名称以及任务本身的名称在旧模式中是唯一的。

    我的问题是,将数据从旧模式移动到新模式的最简单查询是什么?

    这样做是为了支持在同一个数据库中存储两个单独的里程碑、任务等列表。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Vinko Vrsalovic    15 年前

    我会做以下的

    • 第0步:备份数据库

    • 第一步:将唯一的标识符添加到里程碑、类别、技能和工资中。这是一个简单的列添加,默认值为下一个ID。这将为现有名称生成标识符。

    • 第二步:将四个新列添加到现有的任务表中(如果需要,还可以将外键添加到源表中),而不删除旧的名称指向列。

    • 第三步:运行(假定旧的名称指针列称为里程碑、技能等)

        update Tasks set MilestoneID = (
                                        select MilestoneID from Milestones where 
                                        Milestone = Tasks.Milestone
                                       ), 
                         CategoryID = (
                                        select CategoryID from Categories where 
                                        Category = Tasks.Category
                                      ),
                         SkillID = (
                                        select SkillID from Skills where 
                                        Skill = Tasks.Skill
                                      ),
                         PayRateID = (
                                        select PayRateID from PayRates where 
                                        PayRate = Tasks.PayRate
                                      )
      
    • 第四步:检查所有东西是否到位

    • 第五步:从任务表中删除旧列,使新字段非空