java jdbc проверяет наличие значения перед вставкой в ​​таблицу - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над 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 голосов
/ 12 декабря 2018

Ответ от rekiem87 правильный, как и два комментария к Вопросу.

UPSERT

Помимо этих пунктов, если вы хотите обновить существующую записьили иным образом вставьте новый, , такое поведение обычно известно как UPSERT (имеется в виду, UPdate или еще inSERT) или «слияние».

Насколько я помню, такая функция не определена в стандарте SQL.Но многие базы данных реализовали одну.

Например, в Postgres используйте INSERT ON CONFLICT.См. этот первый взгляд , этот учебник , это сообщение , описание функции для Postgres 9.5 и эту презентацию на YouTube.

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
;

Конечно, я игнорируювся тема правильного хранения паролей для пользователей.Я уверен, что этот пример в вопросе довольно надуманный, и вы бы никогда просто не писали пароли.

0 голосов
/ 12 декабря 2018

Как уже говорилось об ошибке и @JBNizet, вы пытаетесь выполнить тот же оператор обновления, но с ExecuteQuery.

Итак, вы пытаетесь выполнить оператор обновления с executeQuery,Вы должны попробовать свою вторую команду с запросом

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

И вы действительно должны делать заметки на комментарии @JBNizet, плохо сочетать строки для создания запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...