2012-10-19 81 views
2

其實我有兩個數據庫,一個用於分級,一個用於生產。 一個表,例如稱爲Class(class_id,descr,faculty_id)faculty_id參考到另一個表稱爲Faculty(faculty_id, name,comment)如何使用外鍵更新表格

我的故事是,我做的臨時數據庫,表繫上這麼多的更新,改變很多教師意見和名稱,而無需改變Class表。我想將升級的Faculty表複製到Production。我最初的方法是從分段生成腳本並刪除生產中的數據表Faculty,然後運行腳本以便將分段數據表Faculty複製到生產中。但是,我發現我不能刪除Faculty表,因爲外鍵。但我不想寫下數百條更新聲明,也不能刪除生產中的類數據,如果我想將Faculty表複製到生產中,我該怎麼辦?

+0

請問什麼版本的SQL Server。 – RBarryYoung

回答

0

試試這個:

備份你的持有外鍵的類表。

截斷類表。

向教師作出更新。

最後還原你的班級表。

+0

這是一個問題或答案?如果它的一個問題,然後PLZ寫它作爲評論! –

+0

您不能截斷有外鍵的表。在這種情況下,類表中的faculty_id .. – dotNETbeginner

1

暫時刪除classfaculty之間的關係,並盡一切,然後重新建立新的關係..

0

讓我們假設所有分期學院代理鍵是相同的生產。

  1. 複製系表生產爲Faculty_Staging
  2. 變更屬於表刪除外鍵參考系
  3. 重命名教員Faculty_backup
  4. 重命名Faculty_Staging:教師
  5. 變更屬於表和恢復外鍵約束

如果重建外鍵引用的嘗試失敗,則有您在升級的Faculty表中存在代理鍵問題。

  1. 重命名教員Faculty_Staging
  2. 重命名Faculty_Backup:教師
  3. 變更屬於表和恢復外鍵約束。

需要考慮的事情:

  1. 不要在學院的代理鍵,準確Faculty_Staging匹配?
  2. 在Faculty和Faculty_Staging匹配完全匹配嗎?
  3. 你有沒有無意中刪除了教師 分期任何生產行?
0

你知道你可以生成SQL腳本使用SQL? (這隻工作,如果教師在臨時和生產相同faculty_id)

這將創腳本插入新的院系:

SELECT 'INSERT INTO production.Faculty (faculty_id, name, comment) 
     SELECT TOP 1 '+LTRIM(faculty_id)+','''+name+''','''+comment+''' 
      FROM production.Faculty 
     WHERE NOT EXISTS (SELECT 1 FROM production.Faculty WHERE faculty_id = '+LTRIM(faculty_id)+');' AS runMeOnProduction 
    FROM staging.Faculty 

這根腳本來更新現有院系:

SELECT 'UPDATE production.Faculty SET name = '''+name+''', comment = '''+comment+''' 
     WHERE faculty_id = '+LTRIM(faculty_id)+';' AS runMeOnProduction 
    FROM staging.Faculty 

如果您在名稱或註釋字段中獲得引號,則可能需要用上面的SQL語句替換名稱和註釋:

REPLACE(name,'''','''''') 
REPLACE(comment,'''','''''') 

這不是最好的方法,尤其是如果您在兩種環境中都在兩個表上插入和更新。但是,如果「教師數據」只是在增加這項工作。

此外,當您運行這些SQL語句時,某些查詢軟件將顯示blob或某些十六進制,因爲它認爲該字符串要顯示很長時間,如果您複製粘貼它,它可能仍會出現正確。否則請嘗試另一個SQL查詢工具。我使用DBVisualiser來處理這種事情,它很有用。我沒有爲任何特定的數據庫查詢工具做廣告,這只是我必須經常查詢mySQL和MSSQL,所以我發現自己從應用程序跳到應用程序以完成工作。

如果在兩種環境中都有數據輸入,則應考慮使用適當的數據比較工具:http://en.wikipedia.org/wiki/Comparison_of_database_tools 一旦您開始使用這些,您的問題可能會有所不同。

這可能是古怪的想法,但我發現它方便以前...