2013-09-30 2 views
0

Мне нужно добавить запись, если уже запись с первичным ключом не существует; в противном случае существующая запись должна быть обновлена. Для этого я запрашиваю db с помощью первичного ключа. Если никакой записи не существует, я добавляю; в противном случае обновление. Я кодирую это в java, используя raw JDBC.Решение о добавлении или обновлении

Есть ли лучший способ сделать это?

+1

Использование гибернации ?? или JDBC? –

+0

Я использую JDBC – Abichellam

ответ

4
  1. вставка ... выберите ... где не существует
  2. INSERT INTO ... VALUES ... дублированием KEY UPDATE ID = идентификатор
  3. REPLACE INTO ... SELECT ... FROM ...
2

Самый мягкий способ сделать это - использовать специальный запрос INSERT ... ON DUPLICATE KEY UPDATE в My Sql. Это намного эффективнее, чем проверка конфликта на стороне приложения.

Фрагмент кода, например:

PreparedStatement statement = null; 
try { 
    statement = connection.prepareStatement(
     "INSERT INTO table (a,b,c) VALUES (?,?,?) ON DUPLICATE KEY UPDATE c=?;" 
    ); 
    int paramIndex = 1; 
    statement.setInt(parameterIndex++, primaryKeyValue); 
    statement.setInt(parameterIndex++, secondValue); 
    statement.setInt(parameterIndex++, thirdValue); 
    statement.setInt(parameterIndex++, thirdValue); 
    int updatedCount = statement.executeUpdate(); 
} finally { 
    statement.close(); 
} 
0

Другой способ REPLACE INTO который имеет тот же синтаксис, как INSERT но удаляет старую запись, когда первичный ключ уже существует, прежде чем вставить.

0

Простейший и наиболее общий способ - считать запись перед вставкой/обновлением.

Псевдо Код:

SELECT COUNT(*) as recordCount FROM mytable WHERE keyField = ? 
if (recordCount > 0) { 
    UPDATE mytable SET value1=? WHERE keyField = ? 
} else { 
    INSERT INTO mytable (keyField, value1) VALUES (?, ?) 
} 
Смежные вопросы