как проверить наличие дублирующих записей в базе данных? - PullRequest
0 голосов
/ 23 июня 2010

Мне нужно применить проверку, чтобы пользователь не мог зарегистрироваться, используя идентификатор электронной почты, который уже существует в базе данных.

Ответы [ 5 ]

9 голосов
/ 23 июня 2010

Установите ограничение на столбец электронной почты или выберите перед вставкой.

3 голосов
/ 23 июня 2010

В сущности, есть два способа добиться этого:

  1. Проверить, существует ли запись перед вставкой внутри той же транзакции. ResultSet#next() из SELECT должно вернуть false. Тогда сделайте INSERT.

  2. Просто все равно выполните INSERT и определите, начинается ли SQLException#getSQLState() любого перехваченного SQLException с 23, что является нарушением ограничения согласно спецификации SQL . Именно это может быть вызвано большим количеством факторов, чем просто нарушение ограничения. А именно, вы не должны обрабатывать каждый SQLException как нарушение ограничения.

    public static boolean isConstraintViolation(SQLException e) {
        return e.getSQLState().startsWith("23");
    }
    

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


Тем не менее, вы обычно не хотите помещать PK в поле электронной почты. Именно они могут быть изменены. Вместо этого используйте управляемый БД автоматически сгенерированный PK (MySQL: BIGINT UNSIGNED AUTO_INCREMENT, Oracle / PostgreSQL: SERIAL, SQLServer: IDENTITY) и укажите в поле электронной почты ключ UNIQUE.

1 голос
/ 23 июня 2010

Вероятно, что-то вроде этого метода DAO:

public boolean isDuplicateEntry(String email) {
        Session session = getSession();
        try {
            User user = (User) session.get(User.class, email);
            session.close();

            return (null != user);

        } catch (RuntimeException e) {
            log.error("get failed", e);
            session.close();
            throw e;
        }
    }
1 голос
/ 23 июня 2010

Установите уникальное ограничение на соответствующий столбец в таблице базы данных. Например (MySQL):

ALTER TABLE Users ADD UNIQUE (Email)

edit - Если поле электронной почты уже является первичным ключом, как вы пишете в комментарии выше, вам это не нужно, потому что первичные ключи по определению уникальны. Затем в Java вы можете перехватить SQLException, который вы получите, если вставите запись с уже существующим первичным ключом, или вы можете сделать SELECT ... WHERE Email=?, прежде чем пытаться вставить, чтобы увидеть, существует ли уже запись с этот адрес электронной почты.

0 голосов
/ 23 июня 2010

Вы можете:

  • сделайте поле электронной почты уникальным, попробуйте вставить и поймать исключение

или

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