Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL-仅向表中插入新条目_Java_Mysql_Sql_Sql Insert - Fatal编程技术网

Java SQL-仅向表中插入新条目

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

我正在尝试将新条目插入数据库,但仅插入新条目。如果数据库中已经存在一个包含我正在添加的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();
    }
下面是我现在的代码。我尝试了几种不同的方法,但我总是遇到例外:

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指定为唯一约束。谢谢