sql >> Databáze >  >> RDS >> Mysql

Aktualizujte sloupce, pokud vstupní hodnoty nejsou null, jinak ignorujte a ponechte stávající hodnoty sloupce v databázi

Uživatelské jméno vkládáte přímo do SQL bez escapování nebo dokonce uvozovek. Myslím, že jste jednoduše přehlédli apostrofy.

Abyste předešli problémům s vkládáním SQL, NIKDY nevkládejte řetězcové konstanty SQL z dynamických dat, VŽDY použijte PreparedStatement a vložte značky.

Alternativně můžete hodnoty escapovat, ale použití značek je mnohem bezpečnější a zlepšuje výkon SQL tím, že databázi umožňuje ukládat zkompilovaný příkaz SQL do mezipaměti.

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());

Poznámka: Odpověď byla rozšířena, aby pokryla problém s nulovou kontrolou.

Když používáte jednoduché vkládání řetězce, "A='" + name + "'" se změní na A='Joe' pro nenulovou hodnotu, ale A='null' pro nulovou hodnotu, což rozhodně není to, co chcete.

Pomocí značek parametrů, hodnotu ? může být null , což znamená, že IFNULL(?, Name) poskytne přesné požadované chování, tj. pomocí hodnoty ? když není null, a hodnotu NAME když ? je null.



  1. Maximální velikost UNIQUE indexu v MySQL

  2. Ukládání dne a měsíce (bez roku)

  3. Načítání data na serveru SQL, CURRENT_TIMESTAMP vs GetDate()

  4. Odstranění úvodních nul z vývojáře varchar sql