插入/更新包含某些列的行并保留其他列的值

时间:2010-09-27 14:09:41

标签: c# mysql

一些背景信息:我有一个名为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模式。

所以,我的问题是,我该如何以聪明的方式做到这一点?

3 个答案:

答案 0 :(得分:1)

我认为你列出了所有可用的选项,以及每个选项的优缺点。至于第三个选项,您可能希望将您的两个查询包装在transaction中,以确保操作保持atomic

答案 1 :(得分:1)

您的第二个选项听起来像是单行更新的赢家。

如果你一次插入/更新很多行,那么你的第三个选择是好的(因为你有两个查询并不重要 - 提供每个查询只会做它应该做的事情。)

<强>更新
通过文档挖掘,如果您愿意,可以发现可以绑定一次 - 您可以使用VALUES()

引用最初绑定的值

<强> UPDATE2: 好吧,实际上你无法使用VALUES(列)获得绑定值,所以改为两个实际上可能有用的建议:

  • 您是否检查了使用named parameters(那么您不需要将它们绑定两次)?
  • 您考虑过存储过程吗?

答案 2 :(得分:0)

嗨,假设您要将field2修改为field6。

你为什么不这样做:

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

您可以设置新值,并通过查询要更新的表来获得其他值。