MySQL : Insert | Update

Mostraré de forma breve como mediante una única sentencia prescindir del botón típico botón de “Modificar” que se encuentra en muchas aplicaciones de modo que la nuestra funcione como un editor de texto con un único botón de guardar; Encargado de actualizar e insertar datos según corresponda.

Sea el caso en que tenemos un formulario para administrar los datos de usuarios por ejemplo y entre otros un botón “Guardar” con un evento que detecta cuando el usuario lo pulsa, regularmente este botón contendrá una sentencia “INSERT INTO….” y existirá otro botón llamado “Modificar” con el fin de actualizar los datos cuando sea necesario que contiene una sentencia “UPDATE…”.

Muy bien, en la siguiente sentencia "Personas" viene a ser el nombre de la tabla con los campos Id, Nombre, Apellido1, Apellido2. newId, newNombre ,…, ha de ser igual al campo de texto empleado.

INSERT INTO Personas(Id,Nombre,Apellido1,Apellido2) VALUES 
     ( 'newId', 'newNombre', 'newApellido1', 'newApellido2' )
ON DUPLICATE KEY UPDATE Id= 'newId', Nombre= 'newNombre', 
     Apellido1= 'newApellido1', Apellido2= 'newApellido2';

Cuando guardamos por primera ves un dato con el valor clave "9397" y un nombre "Jairo" la sentencia se ejecuta en la sección INSERT... de forma ordinaria. Cuando deseamos modificar el nombre por "Hairo" al emplear la misma sentencia el "INSERT... " nos va ha dar error de clave duplicada y ahí es donde entra la otra parte de esta que dice "ON DUPLICATE KEY ", más o menos funciona como la estructura lógica de un If Else.


A continuación muestro un ejemplo que saque de un proyecto en marcha en el cual administro clientes:
…
java.sql.Statement statement = DataBase.connection.createStatement();
statement.executeUpdate("INSERT INTO ClienteParticular(codCliente,nombre,direccion,telFijo,telMovil)
VALUES ( '" + ClienteParticular.data.getCodCliente() + "', '" + ClienteParticular.data.getNombre() + "', '" + ClienteParticular.data.getDireccion() + "', '" + ClienteParticular.data.getTelFijo() + "', '" + ClienteParticular.data.getTelMovil() + "' ) " +
"ON DUPLICATE KEY UPDATE " +
"codCliente= '" + ClienteParticular.data.getCodCliente() + "', " +
"nombre= '" + ClienteParticular.data.getNombre() + "', " +
"direccion= '" + ClienteParticular.data.getDireccion() + "', " +
"telFijo= '" + ClienteParticular.data.getTelFijo() + "', " +
"telMovil= '" + ClienteParticular.data.getTelMovil() + "' " + ";"););
statement.close();
…
Bueno recuerden que esto es aplicable para MySQL, si desean más información sobre esto pueden visitar: http://dev.mysql.com/doc/refman/5.0/en/update.html