JAVA, SQL, вставьте в без дубликатов

Я пытаюсь вставить в таблицу без дубликатов. Я использую SQL derbyclient на Яве. Код не работает (ошибка с 'where not exists'). Любая идея?

Connection connection = DriverManager.getConnection("jdbc:derby://localhost:1527/PetroleumDataStorageSystemDB;create=true");
PreparedStatement statement;
int i = 1;
int progress = 0;
for (Refuel refuelList1 : refuelList) {
     progress = (i / refuelList.size()) * 100;
     String sql = "INSERT INTO refuel (id_tank, time, fuel_volume, "
                  + "refueling_speed) VALUES (?,?,?,?) "
                  + "WHERE NOT EXISTS (SELECT * FROM refuel WHERE "
                  + "id_tank = ? AND time = ? AND fuel_volume = ? AND "
                  + "refueling_speed = ?)";
     statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
     statement.setInt(1, refuelList1.getTankID());
     statement.setString(2, refuelList1.getTime());
     statement.setDouble(3, refuelList1.getFuelVolume());
     statement.setDouble(4, refuelList1.getRefuelingSpeed());
     statement.execute();
     i++;
}

3 ответа

Решение

Проблема в том, как вы строите свой запрос. Это не является действительным INSERT syntaxis

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

INSERT INTO refuel (id_tank, time, fuel_volume, refueling_speed) 
 SELECT ?, ?, ?, ? 
 FROM refuel
 WHERE NOT EXISTS (SELECT 
                   FROM refuel 
                   WHERE
                       id_tank = ? 
                   AND time = ? 
                   AND fuel_volume = ?
                   AND refueling_speed = ?);

Вы не можете иметь WHERE пункт после VALUES список.

Посмотрите здесь для действительного дерби INSERT Синтаксис оператора.

Попробуйте что-то вроде этого (обратите внимание на использование sysibm.sysdummy1, что гарантирует, что вы можете вставить только одну запись максимум. Если вы поместите туда реальное имя таблицы, вы можете вставить несколько записей за раз. Осторожнее с этим.)

INSERT INTO refuel (id_tank, tank, fuel_volume, refueling_speed)
SELECT ?, ?, ?, ?
  FROM sysibm.sysdummy1
 WHERE NOT EXISTS (SELECT *
                     FROM refuel
                    WHERE id_tank = ?
                      AND time = ?
                      AND fuel_volume = ?
                      AND refueling_speed = ?)

Кроме того, как отмечено Davide Lorenzo MARINOУбедитесь, что вы правильно установили все параметры привязки.

В вашем утверждении есть как минимум 8 вопросительных знаков.

Вы должны установить их все!

После этого вы можете проверить еще раз и посмотреть, есть ли другие ошибки.

Другие вопросы по тегам