2010-09-27 4 views
1

Немного справочной информации: У меня есть таблица с именем table_a, которая имеет 12 столбцов. Я хочу вставить или обновить строки со значениями для 6 из этих столбцов, в то время как я не хочу потерять данные в других 6 столбцах. И я хочу сделать это с параметризованным запросом в C#.Вставка/обновление строк с некоторыми столбцами и сохранение значений других

Поле1 является уникальным.

> 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 = ?; 

Это сохранит мои данные, но мне придется привязать параметры дважды.

Третий вариант заключается в создании еще двух запросов и использовании шаблонов SELECT и INSERT INTO/UPDATE.

Итак, мой вопрос: как мне это сделать умным способом?

ответ

1

Ваш второй вариант звучит как победитель для однострочных обновлений.

Ваш третий вариант хорош, если вы вставляете/обновляете сразу несколько строк (так как это не имеет большого значения, если у вас есть два запроса, тогда - предоставление каждому делает только то, что он должен делать).

UPDATE:
копаться документации можно обнаружить, что вы можете связать один раз, если вы хотите - вы можете обратиться к первоначально связанных значений с VALUES()

UPDATE2: Ну, на самом деле вы не можете получить для переплетенных значений со значениями (колонка), поэтому вместо два предложения, которые на самом деле могут помочь:

  • вы проверили об использовании named parameters (тогда вам не нужно было связывать их дважды)?
  • Вы считаете хранимые процедуры?
+0

Именованные параметры выглядят как путь. К сожалению, я сижу на ODBC-Driver, который не поддерживает его. Но я думаю, что я поеду с «INSERT INTO ON DUPLICATE KEY». Благодарю. – Bobby

1

Я думаю, вы указали все доступные варианты, а также плюсы/минусы каждого. Что касается третьего варианта, вы, вероятно, захотите обернуть ваши два запроса в transaction, чтобы убедиться, что операция остается atomic.

0

Привет, скажем, вы хотите изменить поле2 в поле6.

почему бы вам не сделать:

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

Вы кладете новые значения, и вы получите значение других, запрашивая таблицу вы обновляете.

+0

-1 Этот подход не работает для новых записей. – Unreason

Смежные вопросы