Java SQL-仅向表中插入新条目
我正在尝试将新条目插入数据库,但仅插入新条目。如果数据库中已经存在一个包含我正在添加的crn的类,那么我希望跳过它,以避免重复Java SQL-仅向表中插入新条目,java,mysql,sql,sql-insert,Java,Mysql,Sql,Sql Insert,我正在尝试将新条目插入数据库,但仅插入新条目。如果数据库中已经存在一个包含我正在添加的crn的类,那么我希望跳过它,以避免重复 try { String query = null; try { query = "INSERT INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) " + "VALU
try {
String query = null;
try {
query = "INSERT INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?) EXCEPT crn";
} catch(Exception e) {
conn.close();
}
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt(1, crn);
preparedStmt.setString(2, subject);
preparedStmt.setInt(3, creditHours);
preparedStmt.setString(4, title);
preparedStmt.setString(5, capacity);
preparedStmt.setString(6, instructor);
preparedStmt.setString(7, schedule);
preparedStmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
下面是我现在的代码。我尝试了几种不同的方法,但我总是遇到例外:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXCEPT crn' at line 1
数据库条目在没有“EXCEPT crn”的情况下运行良好,但它再次添加了重复项
try {
String query = null;
try {
query = "INSERT INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?) EXCEPT crn";
} catch(Exception e) {
conn.close();
}
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt(1, crn);
preparedStmt.setString(2, subject);
preparedStmt.setInt(3, creditHours);
preparedStmt.setString(4, title);
preparedStmt.setString(5, capacity);
preparedStmt.setString(6, instructor);
preparedStmt.setString(7, schedule);
preparedStmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
如果数据库中已经存在一个包含我正在添加的crn的类,那么我希望跳过它,以避免重复
在MySQL中,我建议:
要使其工作,您需要在列crn
上设置唯一约束(或类似约束):
ALTER TABLE Classes ADD CONSTRAINT cs_classes_uniq_crn UNIQUE(crn);
然后,当发生将生成重复的
crn
的INSERT
时,查询转到实际执行no-op的UPDATE
子句。能否更改所需的行?您可以对它们设置唯一约束,使它们不能接受具有相同值的列
更改表格名称
添加唯一(列名称)
如果需要多列,可以将约束添加到表中,如下所示:
更改表格名称
添加约束名称唯一(第1列、第2列等) 您尝试执行的SQL语句无效,因为MySql不支持除之外的
由于要跳过已存在行的插入,因此可以使用INSERT IGNORE
:
query = "INSERT IGNORE INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?)";
但要使其正常工作,列crn
应该有一个唯一的约束,它似乎是表的主键,因此它已经是唯一的。
如果列crn
没有唯一约束,则可以使用不存在
如下:
query = "INSERT INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) "
+ "SELECT ?, ?, ?, ?, ?, ?, ? "
+ "WHERE NOT EXISTS (SELECT 1 FROM Classes WHERE crn = ?)";
因此,您必须再次作为准备语句的第8个参数传递crn
:
preparedStmt.setInt(8, crn);
或者,如果他不想更新现有文件,则插入“忽略”
records@HomeIsWhereThePcIs:我不太喜欢插入忽略,因为它会默默地忽略操作过程中发生的任何错误(例如无效数据)<重复键上的code>提供了更多的控制。我实际上使用了INSERT IGNORE,但它不起作用。看起来是因为我没有将crn指定为唯一约束。谢谢