JDBC вставить или обновить практику - PullRequest
10 голосов
/ 06 июня 2011

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

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;

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

РЕДАКТИРОВАТЬ: в MYSQL

Ответы [ 4 ]

10 голосов
/ 06 июня 2011

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

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

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

4 голосов
/ 06 июня 2011

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

2 голосов
/ 06 июня 2011

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

1 голос
/ 06 июня 2011

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

...