2013-11-16 3 views
4

У меня есть требование, когда мне нужно вставить номер мобильного телефона в mysql тогда и только тогда, когда номер не существует. Поэтому для этого я сначала проверяю, присутствует ли число в mysql, используя выберите запрос .Если номер отсутствует, то insert.Following мой кодКак вставлять и выбирать из mysql одновременно

PreparedStatement pt1=con.prepareStatement("select * from registerSmsUsers where mobile='"+mobile+"'"); 
PreparedStatement pt=con.prepareStatement("insert into registerSmsUsers values(?,?,?)"); 
     pt.setString(1, name); 
     pt.setString(2, email); 
     pt.setString(3, mobile); 
ResultSet rs1=pt1.executeQuery(); 
     if(rs1.next()) 

{pt.executeUpdate();} 

я не знаю, является ли это эффективным способом или not.Please предложить мне лучший способ, этот

ответ

2

Наверное самый простой способ в MySQL является:

insert ignore into registerSmsUsers values(?,?,?) 

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

Вы можете проверить его здесь : How to 'insert if not exists' in MySQL?

Или здесь: http://dev.mysql.com/doc/refman/5.6/en/insert.html

+1

+1 за вашу помощь, ну мобильный номер не является первичным ключом – SpringLearner

+0

Это может быть не первичный ключ. Но это должен быть уникальный ключ, чтобы использовать его таким образом. – zimi

1

Я думаю, что это будет лучше создать хранимую процедуру, а затем в этой хранимой процедуре вы можете сначала использовать предложение IF NOT EXISTS, чтобы проверить, существует ли пользователь с помощью select заявление. Если пользователя нет, вы можете insert пользователь в базе.

Что-то вроде этого:

IF NOT EXISTS(SELECT 1 FROM `registerSmsUsers` WHERE mobile= @mobile) THEN 
    BEGIN 
    INSERT INTO 
     `registerSmsUsers` 
     (
      //column names 
     ) 
     VALUES 
     (
      //values 
     ); 
    END; 
END IF; 

Также есть INSERT IGNORE заявление, которое вы можете использовать, как это:

insert ignore into registerSmsUsers values(?,?,?) 
+0

Спасибо за Ваш ответ, + 1.Well Что может быть jdbc коды для него? – SpringLearner

+0

@ javaBeginner: - Я думаю, это было бы полезно для вас: - http://docs.oracle.com/javase/tutorial/jdbc/basics/storedprocedures.html –

1
if not exists(select * from registerSmsUsers where mobile='232323') <-- will check your mobile no 
begin 
insert into registerSmsUsers values(?,?,?) 
end 

Это один также является эффективным способом проверить ваш метод является также отлично работает, но это также можно сделать См. разницу. У вас будет только один запрос здесь Надеюсь, это поможет вам поблагодарить

[Редактировать]

Ваших вопросы отвечают

Ya есть исполнение времени дифф между вашим и моим запросом его зависит от размера в базах данных то, что вы используете, если вам используют базу данных небольшого размера (возможно, 1000 человек), тогда вы не увидите никакой разницы между запросом и моим запросом, но если вы используете lakhs пользователей, тогда у вас будет функция performace iss ЕЭС России чек включают план выполнения в MySQL вы получите в режиме реального времени разница между двумя

+0

Спасибо за ответ, + 1 за вашу помощь. Хорошо, пожалуйста, расскажите мне, как узнать, что выше путь лучше, чем мой способ. Можем ли мы узнать время выполнения или что-то еще. – SpringLearner

+0

. Проверить выданный ответ. –

+0

. Его показ дает мне ошибку. – SpringLearner

2

Многие из предлагаемых решений (в том числе у вас) есть условие гонки, которое может вызвать первичный ключ или нарушение уникального ограничения. У вас также есть возможная атака SQL-инъекции, объединяя SQL, а не используя подготовленные параметры оператора. Используйте SELECT ... FOR UPDATE.

PreparedStatement ps = con.prepareStatement("SELECT name, email, mobile FROM registerSmsUsers WHERE mobile=? FOR UPDATE", 
              ResultSet.TYPE_FORWARD_ONLY, 
              ResultSet.CONCUR_UPDATABLE); 
ps.setString(1, mobile); 
ResultSet rs = ps.executeQuery(); 
if (rs.next()) { // it exists already 
    rs.moveToCurrentRow(); 
    rs.updateString(3, mobile); 
    rs.updateRow(); 
} else { // it does NOT exist 
    rs.moveToInsertRow(); 
    rs.updateString(1, name); 
    rs.updateString(2, email); 
    rs.updateString(3, mobile); 
    rs.insertRow(); 
} 
rs.close(); 
ps.close(); 

EDIT: Просто убедитесь, что у вас есть указатель на registerSmsUsers.

CREATE INDEX registerSmsUsers_mobile_ndx ON registerSmsUsers(mobile) 

или уникальный contraint (который неявно создает индекс):

ALTER TABLE registerSmsUsers ADD CONSTRAINT registerSmsUsers_mobile_unq UNIQUE (mobile) 

С индексом, даже миллионы записей обновления/вставка будет в основном мгновенно.

EDIT2: Добавлены опции выбора курсора/результата.

+0

Спасибо за ваш ответ + 1, ну, я должен знать, в каком направлении это будет быстро. Предположим, если у меня есть 1000000 записей, то для вставки одной записи будет проверяться 1000000. – SpringLearner

+0

мобильный - уникальный ключ, так будет ли он эффективным? – SpringLearner

+0

Да, если '' registerSmsUsers'' уже создает объявление '' mobile'' уникальным, будет существовать существующий индекс, и он должен быть очень быстрым. Примите этот ответ, когда найдете, что он работает. – brettw

1

В соответствии с просьбой, вот моя приспособленная версия ответа brettw в:

import java.sql.*; 

public class MySQLtest { 

    public static void main(String[] args) { 
     Connection con; 
     try { 
      con = DriverManager.getConnection(
        "jdbc:mysql://192.168.1.3/zzzTest?" + 
        "useUnicode=yes&characterEncoding=UTF-8" + 
        "&user=root&password=whatever"); 
      String newName = "Gord"; 
      String newEmail = "[email protected]"; 
      String newMobile = "416-555-1212"; 
      String sql = 
        "SELECT " + 
         "id, " + 
         "name, " + 
         "email, " + 
         "mobile " + 
        "FROM registerSmsUsers " + 
        "WHERE mobile = ? " + 
        "FOR UPDATE"; 
      PreparedStatement pst = con.prepareStatement(
        sql, 
        ResultSet.TYPE_FORWARD_ONLY, 
        ResultSet.CONCUR_UPDATABLE); 
      pst.setString(1, newMobile); 
      ResultSet rs = pst.executeQuery(); 
      if (rs.next()) { 
       rs.moveToCurrentRow(); 
       rs.updateString("name", newName); 
       rs.updateString("email", newEmail); 
       rs.updateRow(); 
       System.out.println("Existing row updated."); 
      } 
      else { 
       rs.moveToInsertRow(); 
       rs.updateString("name", newName); 
       rs.updateString("email", newEmail); 
       rs.updateString("mobile", newMobile); 
       rs.insertRow(); 
       System.out.println("New row inserted."); 
      } 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

Обратите внимание, что id является первичным ключом для таблицы: int(11) NOT NULL AUTO_INCREMENT

+0

+1 за ваш хороший ответ – SpringLearner

Смежные вопросы