2010-07-16 48 views
0

我决定重写一个数据库中,我有一个是标准化很差。我创建了新的数据库,但现在需要将旧数据库中的数据移动到新数据库中。我不确定如何完成。例如,在旧的数据库我有一个webDorms表看起来像这样:SQL:正火代码/出口 - 进口

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) 

我手动重新填充建筑物表(这前后20行),但房屋表(这是最相似的以前的webDorms表)包含大约三百行 - 我宁愿不重新输入所有的数据。

上完成此导入的最佳方法有什么建议?

+1

你有新的表在同一个数据库,或在一个单独的?如果他们在单独的数据库中,是否有任何方法可以在它们之间使用SELECT/INSERT语句? – 2010-07-16 14:29:33

+0

它们在不同的数据库中 - 我可以使用SELECT/INSERT并使用SELECT INTO - 但我需要一种方法来跳过某些列(在目标表中)并将字符串转换为关联ID号(例如building_name到building) – davemackey 2010-07-16 14:37:40

回答

2

如果我失去了你的问题很明显的东西,请让我知道了评论,但有什么错误使用INSERT查询到的数据复制过来,而不是重新输入数据?

+0

你能给我一个我怎么做的样本吗?最大的困难是在一些旧列中数据是字符串,但在新表中它需要是整数(ID)。我需要在导入过程中执行该转换。 – davemackey 2010-07-16 14:38:41

+0

在查询中使用CAST或CONVERT关键字将数据转换为正确的格式。例如CAST(StringValueField as INT) – JohnFx 2010-07-16 14:55:08

+0

Tbe值不是从字符串到整数的严格转换。相反,现在存在具有与每个建筑物相关的ID的另一个表格。 – davemackey 2010-07-16 14:56:16

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格式)。然后加载这两个文件。

+0

这看起来不错......将字符串数据转换为整数(ID)数据怎么样? – davemackey 2010-07-16 14:39:46

+0

@davemackey:字符串转换为整数。你有SQL参考吗?检查一下。数据转换几乎都是自动的。 – 2010-07-16 17:06:22

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)

+0

是的,我想过关于房间类型和性别的正常化 - 但是这会产生更多的工作,而不是我在这个时候可以证明的很少或没有实际好处。 – davemackey 2010-07-16 15:18:37

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 

[房间]和[两性]将需要手动添加,也可以用插入过程中的默认值进行填充。

当然,这是你填写好[建筑]表,这可能已被完成之后:

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

然后填充你的[building_name]手动(而不是在所有的数据键控)。

+0

谢谢,这是非常有帮助的。虽然显然你不能投Y/N。 :(但我会添加另一列到旧表中,并手动进行转换... – davemackey 2010-07-16 15:34:21

+0

您可以将它包装在一个案例中,并将结果分别设置为1或0(以避免必须手动执行)。 – rickp 2010-07-16 15:41:26

+0

感谢Rick,我通过添加另一列来完成它 - 但这并不困难 - 我会记住case方法以备将来参考。 – davemackey 2010-07-16 21:07:33