Практика вставки или обновления JDBC

Мне нужно вставить запись в таблицу, если запись не существует, и обновить запись, если запись существует в таблице. Конечно, я могу написать: р-код:

SELECT * FROM table1 WHERE id='abc' by JDBC
if(exists)
   UPDATE table1 SET ... WHERE id='abc' by JDBC;
else
   INSERT INTO table1... by JDBC;

Однако, я не думаю, что код элегантный. В качестве альтернативы я также могу написать его следующим образом: р-код:

int row = Statement.executeUpdate("INSERT INTO table1...", 2);
if(row==0)
  update table1 SET ... WHERE id='abc' by JDBC;

Считаете ли вы, что последний способ лучше и быстрее? Спасибо!

EDIT: в MYSQL

Ответ 1

Это зависит от того, какой тип базы данных вы используете, и можете ли вы использовать преимущества конкретных функций базы данных. MySQL, например, позволяет сделать следующее:

INSERT INTO territories (code, territory) VALUES ('NO', 'Norway')
ON DUPLICATE KEY UPDATE territory = 'Norway'

Однако вышеуказанное не является стандартным (SQL-92). То есть, скорее всего, он не будет работать со всеми базами данных. Другими словами, вам придется придерживаться кода, как вы его написали. Возможно, это не выглядит элегантно, но, вероятно, это наиболее безопасное решение.

Ответ 2

Возможно, вам стоит взглянуть на использование СУБД, чтобы выполнить проверку внутри одного оператора, т.е. использовать условие SQL EXISTS: WHERE EXISTS или WHERE NOT EXISTS

Ответ 3

Возможно, база данных, которую вы используете, имеет функцию вставки или обновления, которая автоматически разрешает вам. В DB2 вы можете использовать MERGE INTO, например. См. здесь

Ответ 4

Вероятно, это причина перехода на один из популярных решений ORM (Hibernate, Toplink, iBatis). Эти инструменты "знают" различные диалекты SQL и оптимизируют ваши запросы.