代码之家  ›  专栏  ›  技术社区  ›  Dave Mackey chem1st

SQL:规范化代码/导出-导入

  •  0
  • Dave Mackey chem1st  · 技术社区  · 16 年前

    我决定重写一个标准化很差的数据库。我已经创建了新数据库,但现在需要将数据从旧数据库移到新数据库中。不过,我不知道该如何完成。例如,在旧数据库中,我有一个WebDorms表,如下所示:

    id (PK, int)
    room_type (varchar) 
    description (char) 
    available (varchar) 
    max_occupancy (varchar) 
    current_occupancy (varchar) 
    dorm_room (varchar) 
    dorm_building (varchar) 
    building_code (varchar) 
    

    在新的数据库中,我把它分为两个表:建筑物和房屋。住房情况如下:

    id (PK, int) 
    building (FK, int) 
    room (nvarchar)
    current_occupancy (int) 
    max_occupancy (int) 
    is_available (bit) 
    gender (nvarchar) 
    room_type (nvarchar)
    

    建筑物看起来像这样:

    id (PK, int) 
    building_code (nvarchar) 
    building_name (nvarchar)
    

    我手动重新填充了buildings表(大约20行),但是housing表(最类似于以前的webdorms表)包含大约300行,我不想重新键入所有数据。

    有什么关于完成这个导入的最佳方法的建议吗?

    4 回复  |  直到 16 年前
        1
  •  2
  •   JohnFx    16 年前

    如果我在你的问题中遗漏了一些明显的东西,请发表评论让我知道,但是使用插入查询来复制数据而不是重新输入数据有什么问题?

        2
  •  1
  •   S.Lott    16 年前

    这就是SQL选择distinct的原因之一——规范化。

    源表中的两个select distinct查询应该创建两个规范化的表。

    你有两种方法。

    INSERT INTO new_table_1(...) AS SELECT DISTINCT a, b, c FROM old table
    INSERT INTO new_table_2(...) AS SELECT DISTINCT d, e, f FROM old table
    

    或者执行两个单独的查询来创建两个单独的提取文件(以csv格式)。然后加载这两个文件。

        3
  •  1
  •   sql_williamd    16 年前

    您可能需要这样做:

    SELECT CAST(current_occupancy AS int) AS current_occupancy,
           CAST(max_occupancy AS int) AS max_occupancy,
           CAST(available AS bit) AS available
    

    你需要看看网上的书,特别是 CAST and CONVERT .

    你提到规范化是重新设计桌子的原因,但是你还没有将所有的可能性规范化。房间类型和性别是这里的候选者,同时最大和当前入住率的数据类型也相当大,除非您希望拥有允许20亿入住者的房间。(0)

        4
  •  1
  •   rickp    16 年前

    它看起来像这样:

    INSERT INTO ['database'].dbo.[housing] (id, building, current_occupancy, max_occupancy, room_type, is_available)
      SELECT id, [building].id, cast(current_occupancy as int), cast(max_occupancy as int), room_type, CASE available WHEN 'Y' THEN 1 ELSE 0 END)
      FROM ['database'].dbo.[webDorms]
      INNER JOIN ['database'].dbo.[building] ON [building].building_code = [webDorms].building_code
    

    需要手动添加[房间]和[性别],或者您可以在插入期间用默认值填充它们。

    当然,这是在您填充了[Building]表之后,可以通过以下方式完成的:

    INSERT INTO ['database'].dbo.[building] (building_code)
      SELECT DISTINCT building_code 
      FROM ['database'].dbo.[webDorms] 
    

    然后手动填充您的[建筑物名称],而不是输入所有数据。

    推荐文章