java—检查是否已将具有相同id的类似行插入到表中?

ee7vknir  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(236)

我有一个 Car 带列的表 carID, brand, color, price . 我在抄 carID 以及 color 去另一张table Detail 有列的 carID, finish, color (与 carID 作为来自的外键 Car table和table 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 table?
我试过这样的方法:

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

它给了我一个错误:
mysqlsyntaxerror您的sql语法有错误;在第1行的“{select carid from detail where carid=123}”附近,检查与mysql服务器版本对应的手册,以获得正确的语法

doinxwow

doinxwow1#

您的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 = ?)";
h5qlskok

h5qlskok2#

您尝试编写的查询是:

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);

这将在表中生成重复的车辆ID。一 insert 如果生成重复项,将返回错误。
要防止错误,请使用 ON DUPLICATE KEY UPDATE :

INSERT INTO detail (carID, finish, color) 
    SELECT ?, ?, color
    FROM car 
    ON DUPLICATE KEY UPDATE carID = VALUES(carID);

相关问题