Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > UpdateOrInsert in MS SQL


Автор: Vitek1234 8.12.2010, 14:09
Для Mysql я могу просто на основании значения полей генерировать запрос для вставки или обновления(в случае если такова есть) записей таблиц с помощью  ON DUPLICATE KEY UPDATE

в Java получаеть что-то такое 

Код

   public void executeInsertMySQLSql(String table, String field, String updateField, List<String> vistaResult) throws SQLException {
        Statement stmt = conn.createStatement();
        for (String string : vistaResult) {
            String sqlExpression = "INSERT INTO " + table + "(" + field + ") VALUES" + string;
            if ((updateField != null) && (updateField.length() > 0)) {
                sqlExpression = sqlExpression + " ON DUPLICATE KEY UPDATE ";
                for (String fd : updateField.split(",")) {
                    sqlExpression = sqlExpression + fd + "=VALUES(" + fd + "),";
                }
                sqlExpression = sqlExpression.substring(0, sqlExpression.length() - 1);//delete last symbol
            }
            stmt.execute(sqlExpression);
        }
    }


Для MSQL в MYSQL:2008 есть что-то подобное MERGE, также можна использовать  IF 
Код

if exists
(Select
ien from cpt 
where ien = '10022')
update cpt
set cpt_code='10023'
else 
insert into cpt(ien,cpt_code)
values ('10022','10023')


Но каждая таблица может содержать ключ с несколькими полями, и вот тепер я даже не знаю как же сделать лучше??? Придётся передавать в метод также и keyNames и keyValues. Но это геморрр... 

Автор: Zloxa 8.12.2010, 14:16
и чем подход динамического построения выражения с  merege принципиально отличается от подхода динамического построения выражения Insert с  ON DUPLICATE KEY UPDATE?

подход с if может сбоить в режиме конкуренции, при определенных уровнях изоляции транзакций. Его применимость - условна.

Автор: Vitek1234 8.12.2010, 14:23
Цитата

и чем подход динамического построения выражения с  merege принципиально отличается от подхода динамического построения выражения Insert с  ON DUPLICATE KEY UPDATE?


отличается тем что нужно отдельно формировать имена ключей с их значениями. Если у меня грубо говоря 40 таблиц, то мне нужно ещё формировать для этих 40 таблиц отдельный список ключей. Кроме того и формировать эти значения ключей....в отличии от ON DUPLICATE KEY, где я мог не заморачоваться есть ли это поле ключом или нет...

Автор: Zloxa 8.12.2010, 14:35
а, ну да.
я сразу и не понял, что вы сочувствия ищете.

Автор: Vitek1234 8.12.2010, 14:44
Может я что-то недоглядел((. Может всё такие есть прямой аналог ON DUPLICATE KEY UPDATE.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)