2015-09-22 63 views
0

我試圖插入表中沒有重複。我在Java中使用SQL derbyclient。代碼不起作用(與'where not exists'錯誤)。任何想法?JAVA,SQL,插入不重複

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

我認爲這個ID是唯一的?如果是這種情況,那麼將它從不存在的地方移開,因爲它會不同? – Dane

+0

什麼是您的rdbms –

+0

Glassfish。該表沒有主鍵。 –

回答

1

問題是如何構建您的查詢。這不是一個有效的INSERT語法

嘗試這樣的事情在你的數據庫第一與虛擬值

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

VALUES列表後面不能有WHERE子句。

看看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指出,一定要正確設置所有綁定參數。