2015-03-31 56 views
0

我在我工廠的一臺機器上運行的應用程序出現問題(我的意思是我工作的地方)。SQL命令插入不存在的地方允許將2個相同的記錄存儲在數據庫中

無論如何,該應用程序創建了唯一的編號,這些編號與被加載到的唯一編號綁定。因此,他們應該始終是唯一的數字。

現在在報告文件中看到2個箱號與其中的組件相同。這意味着將2個數字加載到生成報告的數據庫表中。

現在編碼部分 應用程序的程序員想要通過使用

從數據庫SELECT DISTINCT SQL命令

生成文件來解決這個問題,以便它僅會寫的一個版本雙註冊號碼。 (這是因爲我們不知道數字是如何放入數據庫的兩次)我不想要這個解決方案,因爲它只處理一個已知的症狀而不是原因。可能還有其他我們不知道的效果。

我都建議他們用

INSERT WHERE NOT EXISTS SQL命令

,使得同一項目不能被註冊。

現在他們回到我身邊,說這種情況已經存在....?我不明白這可能嗎?

我能想到的唯一情況是它不僅僅是數字的字段,而是它們執行INSERT WHERE NOT EXISTS的字段的組合。

命令可能以另一種方式失敗嗎?我無法訪問代碼,所以我不能舉一個例子,但我的問題是一個具體問題。我不想受他們的牽連,所以這就是我問你們的原因。

+0

你正在使用哪些DBMS? Postgres的?甲骨文?你爲什麼不創建一個唯一的索引並永久防止重複? – 2015-03-31 16:13:23

+0

,因爲這個重複的數據已經被插入,或許程序員意味着他們只是選擇使用不同的。當然,如果發生這種情況,很可能會再次發生,在這種情況下,他們需要按照您的建議修改代碼。 – JamesMarc 2015-03-31 16:15:03

+0

嗨,大家好,我認爲我們可以刪除現有的數據庫條目,因爲它們在進入報告文件後首次使用,因此我會建議您這樣做。數據庫是mssql 2008 – DavyGravy 2015-03-31 17:07:49

回答

1

這似乎很可能是一個併發問題。

insert into [] where not exists [] 

可以在同一時間提交兩次,並行運行的語句。這兩個語句檢查他們的條件,然後插入。長時間運行的交易可能會更多地暴露這種情況。

要發現錯誤(將在某處失敗)實際上告訴數據庫該值是唯一的。首先,你必須刪除重複項,然後你可以使用例如

create unique index on [ ] 
+0

這似乎是答案,所以我將與他們討論它,但爲什麼不會併發影響唯一命令,是否存在某個用於標識的哈希表或它檢查的內容在插入之前,一定不要使用散列值或什麼的? – DavyGravy 2015-03-31 17:12:43

+0

取決於數據庫,這是以某種方式由鎖執行的。當一個(執行語句的第一個事務)創建並保存該鎖時,其他事務會阻塞並在該鎖釋放時繼續。再次取決於實現,使用事務,錯誤處理,其他的東西可能會失敗或者仍然發生兩次,請留意。根據交易中發生的其他情況,預計會出現死鎖。 – Thaylon 2015-03-31 20:58:19

相關問題