2010-07-16 76 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