所以,我有一個僱員表如下:檢查重複根據兩列
empid | companyid | empnum | ...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 1 | 3 | ...
4 | 2 | 1 | ...
5 | 2 | 2 | ...
上表中的每個員工入職獲得一個唯一的ID(EMPID)由MSSQL自動生成。我有一個PHP應用程序,它將一個CSV文件作爲員工的「主列表」輸入。但是,該CSV文件只有來自右側的「empnum」的列(它不包含companyid或明顯的employeeid)。我遍歷CSV文件的每一行時都會添加companyid。 CSV 應只包含不在數據庫中的員工,但沒有保證,所以我需要檢查以確保員工在插入前不在那裏。驗證方法是確保對於這個特定的companyid(假設我們爲companyid = 1插入),表中沒有匹配的empnum。所以,如果我有這個數據的CSV文件,這將是有效的:
empnum, ...
4, ...
但是,如果我有一個CSV與此數據文件,它不會是有效的:
empnum, ...
3, ...
由於3已經作爲companyid = 1的empnum存在,ENTIRE導入應該失敗。在PHP應用程序,我有:
try {
db->beginTransaction();
while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
//SQL TO INSERT ROW
}
db->commit();
} catch (PDO Exception) {
db->rollBack();
}
我應該使用什麼SQL插入行,以便它會導致異常如果empnum已經存在該companyid?我需要做什麼數據庫更改?我最初的想法是:
選項1 - 插入到一個臨時表中,然後運行一個select查詢,該查詢在companyid/empnum中的匹配值上連接兩個表,如果它返回大於0的行,則拋出異常。 PRO:只有一個選擇。 CON:所有內容都被插入到臨時表中如果它通過select select =很多浪費時間,則轉儲到臨時表中
選項2-根據當前行執行select語句,如果它返回行> 0,拋出異常,否則插入真正的表。 PRO:你一旦遇到失敗就會發現失敗,這樣你就可以節省自己的時間。 CON:你的查詢現在增加了(2x-1),所以如果你成功的話,你會有很多額外的開銷!
所以我的問題是: - 什麼是最好的選擇(1,2,或別的東西完全)? - 我可以以某種方式讓MSSQL在插入時拋出異常嗎?
這不是確切的代碼,但你可以得到一個想法: $ nextEmpnum =( 「SELECT MAX empnum FROM employee_table WHERE companyid =」 $ COMPANY_ID)+1 「INSERT INTO employee_table值(」 $ nextEmpnum。 「,」。$ company_id – 2013-03-05 00:00:07
對不起,我應該指定更好的,我沒有試圖爲empnum創建一個唯一的id,empnum將由導入數據的公司提供,我只需要看看員工已經在桌子上存在(基於companyid和empnum的組合) – 2013-03-05 00:43:55
另外,不知道爲什麼這個問題得到了downvote。如果你downvoted,請說明原因! – 2013-03-05 04:15:09