一些背景信息:我有一个名为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
部分,第二次在{{1}部分,像这样:
UPDATE
这会保留我的数据,但我必须将参数绑定两次。
第三个选项是创建另外两个查询并使用INSERT INTO table_a (field1, ..., field6)
VALUES(?, ..., ?)
ON DUPLICATE KEY UPDATE
field1 = ?, ..., field6 = ?;
和SELECT
/ INSERT INTO
模式。
所以,我的问题是,我该如何以聪明的方式做到这一点?
答案 0 :(得分:1)
我认为你列出了所有可用的选项,以及每个选项的优缺点。至于第三个选项,您可能希望将您的两个查询包装在transaction中,以确保操作保持atomic。
答案 1 :(得分:1)
您的第二个选项听起来像是单行更新的赢家。
如果你一次插入/更新很多行,那么你的第三个选择是好的(因为你有两个查询并不重要 - 提供每个查询只会做它应该做的事情。)
<强>更新强>
通过文档挖掘,如果您愿意,可以发现可以绑定一次 - 您可以使用VALUES()
<强> UPDATE2:强> 好吧,实际上你无法使用VALUES(列)获得绑定值,所以改为两个实际上可能有用的建议:
答案 2 :(得分:0)
嗨,假设您要将field2修改为field6。
你为什么不这样做:
replace into table_a select field1,new_value2,...,new_value6,field7,...,field12 from table_a where field1=filter_field1;
您可以设置新值,并通过查询要更新的表来获得其他值。