我有三個數據庫表這樣的條款不停止重複:SQL服務器:NOT EXISTS當SQL並行地執行
book(book_id INT IDENTITY(1,1) PK, book_name VARCHAR(255), book_code INT UNIQUE)
series(series_id INT IDENTITY(1,1) PK, series_name VARCHAR(255), series_code INT UNIQUE)
bookseries(bookseries_id INT IDENTITY(1,1) PK, book_id INT FK, series_id INT FK) -- The combination (book_id + series_id) should be unique.
我有一個功能,用戶可以上傳電子表格,book_id和series_id人口(電子表格中有大約5萬條記錄)。 上傳電子表格時,如果book_id和series_id的組合尚未存在於bookseries表中,則需要將記錄插入bookseries表中。
所以,我做這樣的事情(僞):
Dim sqlList As New List(Of String)
Dim sql As String = String.Empty
For each row in spreadsheetRows
sql = String.Format("INSERT INTO bookseries(book_id, series_id) SELECT {0},{1} WHERE NOT EXISTS (SELECT 1 FROM bookseries WHERE book_id={0} AND series_id={1})", row.book_id, row.series_id)
sqlList.Add(sql)
If sqlList.Count MOD 500 = 0 Then insertListIntoDB(sqlList)
Next
If sqlList.Count > 0 Then insertListIntoDB(sqlList)
這是正常工作(插入一條記錄,如果它不存在),當一個用戶上傳的電子表格。 但是,如果兩個用戶上載電子表格並且電子表格中填充了相同的記錄,則會將重複記錄插入bookseries
表(重複book_id + series_id
)。
我不明白爲什麼/如何插入重複項,因爲我期待WHERE NOT EXISTS
子句停止重複插入。
例子:INSERT INTO bookseries(book_id, series_id) SELECT 100, 1000 WHERE NOT EXISTS (SELECT 1 FROM bookseries WHERE book_id=100 AND series_id=1000)
誰能勸這是爲什麼不工作,我會期望或建議是否有解決方法嗎?
預先感謝您。
PS:我知道了parameterized SQL
使用,SQL Injection
,Dictionary
,並直接在服務器上等執行raw SQL
的缺點,所以請不要我爲什麼不能在這種情況下使用這些質疑。上面的例子只是爲了讓事情簡單並解釋我想要達到的目標。我的問題純粹與爲什麼NOT EXISTS
子句不會停止我的代碼中的重複插入有關。
取決於提交查詢的時間。在你的情況下,我建議你在數組中插入所有的ids,將所有的項目一次推入臨時表中,然後做一個查詢,從臨時表複製到真正的表中所有不重複的行。 –
交易的邊界在哪裏?你甚至有嗎? – sstan
感謝您的評論,@the_lotus和@sstan。我沒有一個邊界,只是一次性執行查詢'(insert into ...; insert into ...; insert into ...;)'。 – Sathish