java jdbc在插入表之前检查值是否存在

时间:2018-12-11 22:51:46

标签: java jdbc

我正在研究Java项目,但在将值插入表中时遇到了麻烦。在插入此表之前,我想检查一下是否有重复项。

此后,我尝试使用带有结果集的executeUpdate进行executeQuery,但是我得到了“ java.sql.SQLException:无法使用executeQuery()发出数据操作语句。”

这是我正在使用的代码,谢谢您!

    public void registernow(ActionEvent actionEvent) throws IOException, SQLException {
    ConnectionClass registerClass = new ConnectionClass();
    Connection register = registerClass.getConnection();

    try {
        Statement registerStatement = register.createStatement();
        String sql = "INSERT INTO userAuth (username, password) VALUES ('" + txt_username.getText() + "' , '" + txt_password.getText() + "')";
        registerStatement.executeUpdate(sql);

        ResultSet resultSet = registerStatement.executeQuery(sql);

        if (resultSet.next()) {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("register.fxml"));
            Parent fxmlregister = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setTitle("COMP228 Project Registration Complete!");
            stage.setScene(new Scene(fxmlregister));
            stage.show();
        } else {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("registerfailed.fxml"));
            Parent fxmlregisterfailed = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setTitle("COMP228 Project Registration Failed!");
            stage.setScene(new Scene(fxmlregisterfailed));
            stage.show();
        }

2 个答案:

答案 0 :(得分:2)

错误和@JBNizet已经告诉您,您正在尝试执行相同的更新语句,但是使用ExecuteQuery

因此,您尝试使用executeQuery执行更新语句,应尝试使用查询的第二条命令

sql = "SELECT COUNT(1) FROM yourTable WHERE yourCondition = true";
ResultSet resultSet = registerStatement.executeQuery(sql);

您真的会记起@JBNizet的注释,这不利于连接字符串以创建查询。

答案 1 :(得分:2)

Answer by rekiem87和问题上的两条评论都是正确的。

UPSERT

除这些要点外,如果您希望更新现有记录或以其他方式插入新记录,that behavior通常称为UPSERT(意思是UPdate或inSERT)或“合并” 。

我记得,SQL标准中没有定义这样的功能。但是许多数据库已经实现了一个。

例如,在Postgres中,使用INSERT ON CONFLICT。有关Postgres 9.5,请参见this first lookthis tutorialthis postingfeature description和YouTube上的this presentation

INSERT INTO user_ ( username_ , password_ )
VALUES ( 'Alice' , 'pw123' ) 
ON CONFLICT ( username_ )
DO UPDATE SET ( password_ ) = ( 'pw123' )
;

请注意,至少在Postgres实现中,如果已经存在一行,则可以选择不执行任何操作。

INSERT INTO user_ ( username_ , password_ )
VALUES ( 'Alice' , 'pw123' ) 
ON CONFLICT ( username_ )
DO NOTHING
;

当然,我忽略了正确存储用户密码的整个主题。我确信问题中的这个示例是人为设计的,您从不只写密码。