Проверить, вставлена ли похожая строка с таким же идентификатором в таблицу?

0

У меня есть Car столик с колонками carID, brand, color, price. Я carID и color в другую Detail таблицы, в которой есть столбцы carID, finish, color (внешний ключ для таблицы Car - это carID, а столбец 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 детали WHERE carID = 123}' в строке 1

Теги:
insert
prepared-statement

2 ответа

1
Лучший ответ

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

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
    Создавая UNIQUE INDEX это то же самое, что иметь функцию PRIMARY KEY ? Так carID станет PRIMARY KEY ?
  • 0
    @JamesMcTyre. , , Нет. Первичный ключ является уникальным, но уникальный ключ не обязательно должен быть первичным ключом.
Показать ещё 1 комментарий
1

Ваш 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 = ?)";
  • 0
    Я изменил свой вопрос с помощью SQL до того, как увидел ваш пост
  • 0
    @JamesMcTyre {} это неверный синтаксис в mysql
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню