2017-06-27 24 views
0

我有一個程序在SQL數據庫中插入一堆數據。數據由報告組成,每個具有多個標籤用pyodbc返回INSERT的主鍵

標籤具有場REPORT_ID,這是相關的報告的主密鑰的參考。現在

,每次我插入數據時,可以有200個報告甚至更​​多,每個也許有400個標籤。所以在僞代碼我現在這樣做:

for report in reports: 
    cursor_report = sql('INSERT report...') 
    cursor_report.commit() 
    report_id = sql('SELECT @@IDENTITY') 

    for tag in report: 
     cursor_tag += sql('INSERT tag, report_id=report_id') 
    cursor_tag.commit() 

我不喜歡這個由於幾個原因。大多數情況下,我不喜歡SELECT @@IDENTITY聲明。

  1. 這不是說如果另一個進程在正確的時刻插入數據,那麼語句會返回錯誤的主鍵?
  2. 我寧願INSERT report...返回插入的主鍵,這是可能的嗎?

由於我目前不得不在報告之間提交程序「暫停」在這些時刻。如果我能在最後完成所有事情,那麼它將大大減少花費的時間。我一直在考慮在報告創建一個單獨的字段用於識別,所以我可以report_id = (SELECT id FROM reports WHERE seperate_field=?)標籤中的東西,但看起來不是很優雅。

回答

1

這不是說如果另一個進程在正確的時刻插入數據,那麼[「SELECT @@ IDENTITY」]語句會返回錯誤的主鍵?

號數據庫引擎跟蹤每個連接插入的最後一個標識值,並返回其上執行SELECT @@IDENTITY語句的連接合適的值。

+0

噢好吧,我認爲它返回了最後一個主鍵插入任何連接的地方 - 我只有對SQL的中間理解。謝謝你的回答,這至少意味着我的方法應該按我的意願工作,即使它比我想要的慢一點:) –