鑑於我們在下表中有:什麼是最好的方式插入/更新的數據到數據庫
CREATE TABLE TestData
(
ID INT NOT NULL PRIMARY KEY,
Value INT
)
當寫入數據表中,我會盡量UPDATE
表,如果ID已經存在或否則INSERT
一個新的行。
有我寫或在生產代碼遇到幾個選項:
首先執行
UPDATE
查詢,如果沒有行被更新,執行INSERT
查詢執行
Insert
查詢首先第一,如果失敗,執行INSERT
查詢第一執行
SELECT
查詢與新的ID ,那麼如果該行存在做UPDATE
其他INSERT
查詢執行一個大的查詢做的所有選擇更新或插入
我的問題是什麼是best practice
或most efficient
或preferred method
之中上述選項(或你自己的方法)?
對於上述選項的示例代碼:
(1)首先執行UPDATE
查詢,如果沒有行被更新,執行INSERT
查詢
int affectedRows = 0;
using (IDbCommand updateCmd = new SqlCommand("UPDATE TestData SET Value = @Value WHERE ID = @ID", myConn))
{
try
{
// ...add params
affectedRows = updateCmd.ExecuteNonQuery();
}
catch (SqlException) { /*...*/ }
}
if (affectedRows == 0)
{
using (IDbCommand insertCmd = new SqlCommand("INSERT INTO TestData VALUES (@ID, @Value)", myConn))
{
try
{
// ...add params
affectedRows = insertCmd.ExecuteNonQuery();
}
catch (SqlException) { /*...*/ }
}
}
(2)第一首先執行Insert
查詢,如果失敗,執行INSERT
查詢
int affectedRows = 0;
using (IDbCommand insertCmd = new SqlCommand("INSERT INTO TestData VALUES (@ID, @Value)", myConn))
{
try
{
// ... add params
affectedRows = insertCmd.ExecuteNonQuery();
}
catch (SqlException) { /*...*/ }
}
if (affectedRows == 0)
{
using (IDbCommand updateCmd = new SqlCommand("UPDATE TestData SET Value = @Value WHERE ID = @ID", myConn))
{
try
{
// ...add params
affectedRows = updateCmd.ExecuteNonQuery();
}
catch (SqlException) { /*...*/ }
}
}
(3)執行SELECT
曲ERY新的ID,然後再如果行存在做UPDATE
其他INSERT
查詢
bool dataExist = false;
// ...
using (IDbCommand selectCmd = new SqlCommand("SELECT ID FROM TestDate WHERE [email protected]", myConn))
{
try
{
// ... add param
using (IDataReader reader = selectCmd.ExecuteReader())
dataExist = reader.Read();
}
catch (SqlException) { /*...*/ }
}
if (dataExist) { /* update query, similar to above one*/ }
else { /* insert, similar to above one */ }
(4)進行一個大的查詢做的所有選擇更新或插入
string query = "IF EXISTS (SELECT ID FROM TestData WHERE [email protected]) " +
"UPDATE TestData SET Value = @Value WHERE ID = @ID " +
"ELSE INSERT INTO TestData VALUES (@ID, @Value)";
using (IDbCommand bigQueryCmd = new SqlCommand(query, myConn))
{
try
{
// ... add param
bigQueryCmd.ExecuteNonQuery();
}
catch (SqlException) { /*...*/ }
}
檢查您是否可以使用'MERGE' – lad2025
對我而言..因爲你的代碼非常容易發生SQL注入!如果你用它來克服,那麼你可以創建一個存儲過程並創建你的更新並在其中插入邏輯。 –
@ lad2025這是一個直接插入表中的新數據。我應該從哪裏'合併'? –