我决定重写一个标准化程度很低的数据库。我已经创建了新数据库,但现在需要将旧数据库中的数据移动到新数据库中。我不确定如何完成。例如,在旧数据库中,我有一个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)
在新数据库中,我将其拆分为两个表格Buildings and Housing。住房看起来像这样:
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表(它大约有二十行),但Housing表(与之前的webDorms表最相似)包含大约三百行 - 我宁愿不重新键入所有数据。
有关完成此导入的最佳方法的任何建议吗?
答案 0 :(得分:2)
如果我在你的问题中遗漏了一些明显的东西,请通过评论告诉我,但使用INSERT查询复制数据而不是重新输入数据有什么问题?
答案 1 :(得分:1)
这是SQL具有SELECT 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格式)。然后加载这两个文件。
答案 2 :(得分:1)
你会想做这样的事情:
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)
答案 3 :(得分:1)
看起来与此类似:
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
[Room]和[Gender]需要手动添加,或者您可以在插入期间使用默认值填充它们。
这当然是在您填充了[building]表后,可以通过以下方式完成:
INSERT INTO ['database'].dbo.[building] (building_code)
SELECT DISTINCT building_code
FROM ['database'].dbo.[webDorms]
然后手动填充[building_name](而不是键入所有数据)。