У меня есть 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 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);
Ваш 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 = ?)";
{}
это неверный синтаксис в mysql
UNIQUE INDEX
это то же самое, что иметь функциюPRIMARY KEY
? ТакcarID
станетPRIMARY KEY
?