2010-09-27 63 views
1

稍微背景信息:我有一個名爲table_a的表,它有12列。我想插入或更新這些列中的6個值的行,而我不想丟失其他6列中的數據。我想用C#中的參數化查詢來做到這一點。插入/更新某些列的行並保留其他列的值

field1是唯一的。

> SELECT * FROM table_a; 

+----+--------+--------+---+---------+---------+ 
| Id | field1*| field2 |...|field11 | field12 | 
+----+--------+--------+---+---------+---------+ 
| 1 | AA  | BB  |...| KK  | LL  | 
| 2 | AA  | BB  |...| KK  | LL  | 
| 3 | AA  | BB  |...| KK  | LL  | 
| 4 | AA  | BB  |...| KK  | LL  | 
+----+--------+--------+---+---------+---------+ 

的問題是,我首先想到的是用REPLACE INTO,可惜這將刪除6個沒有觸及值:

> REPLACE INTO table_a (field1, ..., field6) VALUES ('AA', ...); 
> REPLACE INTO table_a (field1, ..., field6) VALUES ('AB', ...); 

+----+--------+--------+---+---------+---------+ 
| Id | field1*| field2 |...| field11 | field12 | 
+----+--------+--------+---+---------+---------+ 
| 1 | AA  | BB  |...| NULL | NULL | 
| 2 | AB  | BB  |...| NULL | NULL | 
| 3 | AC  | BB  |...| KK  | LL  | 
| 4 | AD  | BB  |...| KK  | LL  | 
+----+--------+--------+---+---------+---------+ 

我的第二個想法是使用INSERT INTO ... ON DUPLICATE KEY UPDATE,後來我想必須第二次綁定參數,第一次在INSERT部分中,第二次在UPDATE部分中,如下所示:

INSERT INTO table_a (field1, ..., field6) 
VALUES(?, ..., ?) 
ON DUPLICATE KEY UPDATE 
field1 = ?, ..., field6 = ?; 

這將保留我的數據,但我必須綁定參數兩次。

第三個選項是創建另外兩個查詢並使用SELECTINSERT INTO/UPDATE模式。

所以,我的問題是,我該如何做到這一點?

回答

1

您的第二個選項聽起來像是單行更新的贏家。

如果您一次插入/更新許多行,那麼您的第三個選擇是很好的(因爲當你有兩個查詢時它們並不重要 - 只提供它應該做的事情)。

UPDATE:
通過文檔一個挖掘發現,如果你願意,你可以綁定一次 - 你可以參考最初結合的值與VALUES()

UPDATE2: 嗯,其實你不能得到到VALUES(列)的綁定值,所以而不是兩個建議,實際上可能會有所幫助:

  • 你檢查過使用named parameters(那麼你不需要限制他們兩次)?
  • 您是否考慮過存儲過程?
+0

命名參數似乎是要走的路。不幸的是,我坐在一個不支持它的ODBC驅動程序。但是我想我會一直使用'INSERT INTO ON DUPLICATE KEY'。謝謝。 – Bobby 2010-09-28 06:23:46

1

我想你已經列出了所有可用的選項,以及每個選項的優缺點。至於第三個選項,您可能想要將您的兩個查詢包裝在transaction中,以確保操作仍爲atomic

0

嗨,假設您想要將field2修改爲field6。

你爲什麼不這樣做:

replace into table_a select field1,new_value2,...,new_value6,field7,...,field12 from table_a where field1=filter_field1; 

你把新的價值觀和你通過查詢你更新的表得到別人的價值。

+0

-1此方法不適用於新記錄。 – Unreason 2010-09-27 14:29:01

相關問題