2015-09-22 5 views
0

Я пытаюсь вставить в таблицу без дубликатов. Я использую SQL derbyclient в Java. Код не работает (ошибка с 'where not exists'). Есть идеи?JAVA, SQL, insert into no-duplicates

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++; 
} 
+0

Я предполагаю, что идентификатор уникален? если это так, то удалите его из своего места, где не существует, поскольку оно будет другим? – Dane

+0

Что вы rdbms –

+0

Glassfish. В таблице нет первичного ключа. –

ответ

1

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

Попробуйте что-то подобное на вашем db first с фиктивными значениями.

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 = ?); 
+0

Спасибо, отлично работает! ;) –

0

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

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

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

+0

Спасибо, хорошая работа! ;) –

+0

Если вы нашли ответ правильным и полезным, вы можете его перенести и пометить как правильный ответ зеленым флагом. Спасибо! –

0

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

Посмотрите here на действующий синтаксис оператора Derby 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, убедитесь, что вы установили все обязательные параметры правильно.