Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zaktualizuj kolumny, jeśli wartości wejściowe nie są puste, w przeciwnym razie zignoruj ​​i zachowaj istniejące wartości kolumny w bazie danych

Wstawiasz nazwę użytkownika bezpośrednio do SQL bez uciekania lub nawet cytowania. Myślę, że po prostu przegapiłeś apostrofy.

Aby zapobiec problemom z wstrzykiwaniem SQL, NIGDY nie wstawiaj stałych łańcuchowych SQL z danych dynamicznych, ZAWSZE używaj PreparedStatement i wstawiaj znaczniki.

Alternatywnie, unikaj wartości, ale używanie znaczników jest znacznie bezpieczniejsze i poprawia wydajność SQL, umożliwiając bazie danych buforowanie skompilowanej instrukcji SQL.

String updateQuery = "UPDATE " + USER_TABLE +
                       " SET " + USER_TABLE_FIRST_NAME + "=IFNULL(? ," + USER_TABLE_FIRST_NAME + ")," +
                                 USER_TABLE_LAST_NAME + "=?," +
                                 USER_TABLE_ABOUT_ME + "=?," +
                                 USER_TABLE_CITY + "=?," +
                                 USER_TABLE_DOB + "=?" +
                     " WHERE " + USER_TABLE_ID + "=?";
PreparedStatement stmt = conn.prepareStatement(updateQuery);
stmt.setString(1, user.getFirstName());
stmt.setString(2, user.getLastName());
stmt.setString(3, user.getAboutMe());
stmt.setString(4, user.getCity());
stmt.setString(5, user.getDateOfBirth());
stmt.setString(6, user.getUserId());

Uwaga: Odpowiedź rozszerzona o problem z testem zerowym.

Gdy używasz prostego wstrzykiwania ciągu znaków, "A='" + name + "'" staje się A='Joe' dla wartości innej niż null, ale A='null' dla wartości null, co zdecydowanie nie jest tym, czego chcesz.

Używając znaczników parametrów, wartość ? może być null , co oznacza, że ​​IFNULL(?, Name) da dokładnie potrzebne zachowanie, tj. przy użyciu wartości ? kiedy nie jest null, a wartość NAME kiedy ? jest zerowe.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd MySQL 1022 podczas tworzenia tabeli

  2. Jak zapisać wypełnioną ulotkę z punktami wielokąta. Rysuj do tabeli mysql

  3. Czy występuje spadek wydajności, jeśli w tabeli jest zbyt wiele kolumn?

  4. Błędy pojawiające się w kodzie mysqli i call_user_func_array()

  5. Jak zablokować pojedynczy rząd