Objetivo: aprender lo fundamental para poder modificar datos en tablas MySQL.
Llevo toda la mañana con el gusanillo de escribir algo sobre MySQL y estaba deseando llegar a casa para ponerme a hacerlo. No suelo decidir con antelación a qué dedicaré el siguiente artículo del blog hasta el mismo día en que he de escribirlo. Mis motivaciones pueden ser diferentes: últimamente he escrito bastante sobre Python porque estoy desarrollando mis propias herramientas de productividad empleando ese lenguaje y me resulta mucho más cómodo no desconectar y seguir con lo mismo que dar un brusco requiebro (la programación es como el ajedrez y las matemáticas: monopoliza tu atención y energía); otras veces tomo en consideración los comentarios que me hacen llegar los que me leen (particularmente de modo habitual) e intento ayudarlos preferentemente; y, desde luego, también está el remordimiento, que por ejemplo me está martirizando recordándome que llevo varios meses sin decir ni pío sobre Knoppix (entre otros temas).
Sea lo que sea, es el momento de aplicar una nueva mano de pintura sobre MySQL.
Si echas un vistazo al índice general de artículos dedicados al tema (los más recientes son los de arriba) verás qué ya sabemos hacer bastantes cosas: crear tablas, rellenarlas, agregar nuevos datos, eliminarlos… Hoy veremos cómo cambiar datos ya existentes.
Tomemos una tabla de ejemplo, como esta que me he encontrado de artículos anteriores:
mysql> select * from consumibles;
+------------+---------------------+-------+
| referencia | impresora | stock |
+------------+---------------------+-------+
| ACME2598X | ACME INKJET Ultra | 5 |
| ACME4501Y | ACME PseudoJET Plus | 12 |
+------------+---------------------+-------+
2 rows in set (0.00 sec)
Se trata de una sencilla tabla para mantener el stock de consumibles de impresión. Agregaremos algunas filas para tener más juego, a la vez que nos servirá para repasar conceptos:
mysql> INSERT INTO consumibles VALUES
-> ('WG31', 'WALNUT InkJetPrad', 2);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO consumibles VALUES
-> ('WG40', 'WALNUT LaserGROVE', 10);
Query OK, 1 row affected (0.06 sec)
Tras lo cual consumibles ofrece el siguiente aspecto:
mysql> SELECT * FROM consumibles;
+------------+---------------------+-------+
| referencia | impresora | stock |
+------------+---------------------+-------+
| ACME2598X | ACME INKJET Ultra | 5 |
| ACME4501Y | ACME PseudoJET Plus | 12 |
| WG31 | WALNUT InkJetPrad | 2 |
| WG40 | WALNUT LaserGROVE | 10 |
+------------+---------------------+-------+
Imagina a continuación que colocamos un tóner de la LaserGROVE y otro de la PseudoJET, disminuyendo su stock en una unidad. ¿Cómo reflejaríamos estos cambios en la tabla de consumibles?
Comencemos por la LaserGROVE. Presta mucha atención al siguiente comando:
mysql> UPDATE consumibles SET stock = 9
-> WHERE referencia = 'WG40';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
El comando es UPDATE, seguido del nombre de la tabla. A continuación, con SET, indicamos la columna o columnas que queremos modificar, junto con su valor. La claúsula WHERE, que ya conociste en el artículo dedicado a cómo eliminar registros, nos sirve para indicar en qué filas realizaremos los cambios.
Has de ser muy cuidadoso con WHERE, pues, tal como está escrito el comando, se actualizarán todas las filas que cumplan la condición del filtro. En caso de duda, no hubiese estado de más comprobar mediante un SELECT cuál sería el ámbito de actuación antes de realizar la modificación:
mysql> SELECT * FROM consumibles WHERE referencia = 'WG40';
+------------+-------------------+-------+
| referencia | impresora | stock |
+------------+-------------------+-------+
| WG40 | WALNUT LaserGROVE | 10 |
+------------+-------------------+-------+
1 row in set (0.00 sec)
Como puedes observar, sólo aparece la fila sobre la que queremos actuar.
Fíjate cómo queda la tabla consumibles tras la actualización del stock de la LaserGrove:
mysql> Smysql> SELECT * FROM consumibles;
+------------+---------------------+-------+
| referencia | impresora | stock |
+------------+---------------------+-------+
| ACME2598X | ACME INKJET Ultra | 5 |
| ACME4501Y | ACME PseudoJET Plus | 12 |
| WG31 | WALNUT InkJetPrad | 2 |
| WG40 | WALNUT LaserGROVE | 9 |
+------------+---------------------+-------+
4 rows in set (0.00 sec)
Podríamos emplear un comando similar para actualizar el stock de la PseudoJET, pero prefiero mostrarte una nueva técnica:
mysql> UPDATE consumibles SET stock = stock - 1
-> WHERE referencia = 'ACME4501Y';
Query OK, 1 row affected (0.15 sec)
Rows matched: 1 Changed: 1 Warnings: 0
En lugar de indicar directamente el contenido del campo stock hemos utilizado una expresión aritmética que se ocupa de decrementar en una unidad su valor.
Creo que es suficiente por hoy: las unidades de información han de ser pequeñas pero significativas, de modo que no se deje de percibir sensación de avance tras su estudio.
Javier Montero Gabarró
http://elclubdelautodidacta.es/wp/2012/08/mysql-modificando-los-datos-de-una-tabla/
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
¡Accede al índice con todos los artículos sobre MySQL!