【问题标题】:Java SQL - Insert into table only new entriesJava SQL - 仅将新条目插入表中
【发布时间】:2020-04-06 21:16:20
【问题描述】:

我正在尝试将新条目插入我的数据库,但只插入新条目。如果数据库中已经存在带有我要添加的 crn 的类,那么我想跳过它以免重复。

下面是我现在拥有的代码。我尝试了几种不同的方法,但我不断收到异常:

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

【问题讨论】:

    标签: java mysql sql sql-insert


    【解决方案1】:

    如果数据库中已经存在具有我要添加的 crn 的类,那么我想跳过它以免重复。

    在 MySQL 中,我会推荐 insert ... on duplicate key syntax:

    INSERT INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule)
    VALUES (?, ?, ?, ?, ?, ?, ?)
    ON DUPLICATE KEY UPDATE crn = VALUES(crn);
    

    为此,您需要在列 crn 上设置唯一约束(或类似约束):

    ALTER TABLE Classes ADD CONSTRAINT cs_classes_uniq_crn UNIQUE(crn);
    

    然后,当INSERT 发生并生成重复的crn 时,查询转到UPDATE 子句,它实际上执行了一个空操作。

    【讨论】:

    • 或者INSERT IGNORE如果他不想更新现有记录
    • @HomeIsWhereThePcIs:我不是INSERT IGNORE 的忠实粉丝,因为它会默默地忽略操作期间发生的任何错误(例如无效数据)。 ON DUPLICATE KEY 提供更多控制权。
    • 我实际上在使用 INSERT IGNORE 但它不起作用。看起来是因为我没有将 crn 指定为唯一约束。谢谢!
    【解决方案2】:

    你能改变你想要的行吗?您可以对它们设置唯一约束,这样它们就不能接受具有相同值的列。

    ALTER TABLE 表名 添加唯一(column_name);

    如果您需要多个列,您可以将约束添加到表中,如下所示: ALTER TABLE 表名 ADD CONSTRAINT constraint_name UNIQUE(column1、column2 等);

    【讨论】:

      【解决方案3】:

      您尝试执行的 SQL 语句无效,因为 MySql 不支持EXCEPT。
      由于您想跳过插入已经存在的行,您可以使用INSERT IGNORE:

      query = "INSERT IGNORE INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) "
              + "VALUES (?, ?, ?, ?, ?, ?, ?)";
      

      但要使其正常工作,crn 列应该有一个唯一约束。
      它似乎是表的 PRIMARY KEY,所以它已经是唯一的。
      如果crn 列没有唯一约束,您可以像这样使用NOT EXISTS:

      query = "INSERT INTO Classes (crn, subject, creditHours, title, capacity, instructor, schedule) "
              + "SELECT ?, ?, ?, ?, ?, ?, ? "
              + "WHERE NOT EXISTS (SELECT 1 FROM Classes WHERE crn = ?)";
      

      所以你必须再次作为准备好的语句crn的第8个参数传递:

      preparedStmt.setInt(8, crn);
      

      【讨论】:

        猜你喜欢
        • 2017-01-10
        • 2013-02-05
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多