Проверить, вставлена ​​ли похожая строка с таким же идентификатором в таблицу? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть Car таблица со столбцами carID, brand, color, price.Я копирую carID и color в другую таблицу Detail, в которой есть столбцы carID, finish, color (при этом carID является внешним ключом из таблицы Car, а столбец finish не NULL).

У меня есть подготовленный оператор SQL:

public void insertToDetail(int carID, String finish){

     String sql = "INSERT INTO detail (carID, finish, color) SELECT ?, ?, color FROM car WHERE carID = ?;";

     PreparedStatement psmt = connect.prepareStatement(sql);

     psmt.setString(1, carID);
     psmt.setInt(2, finish);
     psmt.setInt(3, carID);
     psmt.executeUpdate();  
     psmt.close();
}

Как проверить, не введено ли точно такое же значение carID в мою таблицу Detail?

Я попробовал что-то вроде:

"INSERT INTO detail (carID, finish, color) 
SELECT ?, ?, color FROM car 
WHERE NOT EXISTS {
     SELECT carID 
     FROM detail 
     WHERE carID = ?
 } ;";

И он дал мне ошибку:

MySQLSyntaxError У вас есть ошибка в вашем синтаксисе SQL;проверьте правильность синтаксиса в руководстве, соответствующем версии вашего сервера MySQL, рядом с '{SELECT carID FROM detail WHERE carID = 123}' в строке 1

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Запрос, который вы пытаетесь написать:

INSERT INTO detail (carID, finish, color) 
    SELECT ?, ?, color
    FROM car 
    WHERE NOT EXISTS (SELECT carID 
                      FROM detail 
                      WHERE carID = ?
                     ) ;

Однако NOT EXISTS - неправильный подход.Пусть база данных сделает проверку.Так что создайте уникальный индекс:

CREATE UNIQUE INDEX unq_detail_carid on detail(carID);

Это будет генерировать повторяющиеся идентификаторы автомобилей в таблице.insert вернет ошибку, если сгенерирован дубликат.

Чтобы предотвратить ошибку, используйте ON DUPLICATE KEY UPDATE:

INSERT INTO detail (carID, finish, color) 
    SELECT ?, ?, color
    FROM car 
    ON DUPLICATE KEY UPDATE carID = VALUES(carID);
0 голосов
/ 30 ноября 2018

Ваш sql имеет синтаксическую ошибку, необходимо изменить {} на () и удалить ; в конце

, поэтому измените

"INSERT INTO detail (carID, finish, color) SELECT ?, ?, color FROM car WHERE NOT EXISTS {
SELECT carID FROM detail WHERE carID = ?;";

на

"INSERT INTO detail (carID, finish, color) SELECT ?, ?, color FROM car WHERE NOT EXISTS (
SELECT carID, finish, color FROM detail WHERE carID = ?)";
...