MySQL: Insertando datos sin facilitar todos los campos

Objetivo: mostrar cómo insertar filas en una tabla MySQL sin facilitar todos los campos, es decir, decidiendo selectivamente cuáles rellenaremos.

En el artículo anterior aprendimos a insertar un registro en una tabla MySQL con el comando:

INSERT INTO nombre_tabla VALUES (lista de valores separados por comas)

Vimos que la lista de valores debía coincidir, en número y orden, con los campos de la tabla.

Pero, ¿y si no quisiéramos rellenar la fila completamente? Quizás no tengamos los datos completos y nos gustaría tener la posibilidad de agregarlos posteriormente.

MySQL permite que agreguemos filas indicando selectivamente qué columnas queremos rellenar.

Recuperemos alguna de las tablas de la sesión anterior, como la de fichajes:

mysql> DESC fichajes;
+---------+------+------+-----+---------+-------+
| Field   | Type | Null | Key | Default | Extra |
+---------+------+------+-----+---------+-------+
| fecha   | date | YES  |     | NULL    |       |
| entrada | time | YES  |     | NULL    |       |
| salida  | time | YES  |     | NULL    |       |
+---------+------+------+-----+---------+-------+
3 rows in set (0.00 sec)

en la que ya teníamos algunos datos:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
+------------+----------+----------+
3 rows in set (0.00 sec)

Imaginemos que queremos introducir datos para el día 4 de julio, pero sólo conocemos la hora de entrada. Observa la nueva versión de INSERT:

mysql> INSERT INTO fichajes (fecha, entrada) VALUES ('2012-07-04', '07:25');
Query OK, 1 row affected (0.09 sec)

A continuación del nombre de la tabla indicamos, entre paréntesis, el nombre de los campos en los que vamos a introducir datos. En la lista VALUES facilitamos los datos correspondientes a esos campos, en el mismo orden en el que están referenciados.

Veamos nuestra nueva fila:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL     |
+------------+----------+----------+
4 rows in set (0.00 sec)

Observa que el dato que no hemos indicado se rellena con NULL, que es el valor por defecto que tiene el campo salida (observa más arriba la estructura de la tabla tras DESC). Más adelante veremos cómo indicar valores por defecto a la hora de crear una tabla.

El orden de los datos en VALUES no tiene por qué ser el que les corresponde naturalmente. La única condición es que coincida con el especificado en la lista de campos.

Por ejemplo, vamos a agregar un nuevo registro, pero esta vez indicaremos la entrada antes que la fecha:

mysql> INSERT INTO fichajes (entrada, fecha) VALUES ('07:45', '2012-07-05');
Query OK, 1 row affected (0.05 sec)

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL     |
| 2012-07-05 | 07:45:00 | NULL     |
+------------+----------+----------+
5 rows in set (0.00 sec)

Naturalmente, también podemos agregar varias filas en una única operación, tal como explicamos en el artículo anterior:

mysql> INSERT INTO fichajes (entrada, fecha) VALUES
    -> ('07:30', '2012-07-06'),
    -> ('07:15', '2012-07-07'),
    -> ('08:01', '2012-07-08');
Query OK, 3 rows affected (0.11 sec)
Records: 3  Duplicates: 0  Warnings: 0

La única condición, como vemos, es separar los registros, rodeados entre paréntesis, mediante comas.

Comprueba que las tres filas insertadas aparecen correctamente:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL     |
| 2012-07-05 | 07:45:00 | NULL     |
| 2012-07-06 | 07:30:00 | NULL     |
| 2012-07-07 | 07:15:00 | NULL     |
| 2012-07-08 | 08:01:00 | NULL     |
+------------+----------+----------+
8 rows in set (0.00 sec)

Esta ha sido la pieza de hoy. Tú decides qué hacer con ella…

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/07/mysql-insertando-datos-sin-facilitar-todos-los-campos/


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!

Insertando datos en nuestras tablas MySQL

Objetivo: aprender a agregar datos a una tabla en MySQL.

Hemos dedicado varios artículos a describir los distintos tipos de datos que existen en MySQL. Desde luego que aún nos quedan bastantes, pero he juzgado interesante hacer un pequeño alto en el camino para cambiar de tercio y darle más vidilla al aprendizaje.

A lo largo de esta serie, practicando los diversos tipos de datos, hemos creado muchas tablas de ejemplo. Pero las tablas vacías son como colegios sin niños, carentes de sentido.

Ha llegado el momento de que demos vida a nuestras tablas y aprendamos a insertar datos en ellas. Para ello, nada mejor que utilizar los ejemplos que ya creamos.

Recuperemos la tabla de consumibles, con la siguiente estructura:

mysql> DESC consumibles;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| referencia | varchar(15) | YES  |     | NULL    |       |
| impresora  | varchar(20) | YES  |     | NULL    |       |
| stock      | int(11)     | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Como puedes observar, la tabla consta de tres campos, dos de tipo VARCHAR para albergar cadenas de texto y otro de tipo INT para almacenar un número entero.

Vamos a agregar el primer registro. Presta atención al siguiente comando:

mysql> INSERT INTO consumibles VALUES ( 'ACME2598X', 'ACME INKJET Ultra', 5 );
Query OK, 1 row affected (0.12 sec)

El comando es INSERT INTO, seguido del nombre de la tabla y de la palabra VALUES que, entre paréntesis, contiene una lista con todos los campos de que consta el registro. Como siempre, no olvides el punto y coma final.

Atiende cuidadosamente: todos los campos de que consta el registro y, además, en el mismo orden en que aparecen en la estructura de la tabla.

Ya veremos qué hay más formas de introducir datos, pero primero debes manejarte bien con esta.

¡Qué emoción, verdad? Ya hay datos. Apuesto a que estás deseando verlos.

Aunque hablaremos de SELECT a su debido momento, quédate por ahora con el siguiente comando, que viene a significar algo así como “muéstrame todo el contenido de la tabla consumibles”:

mysql> SELECT * FROM consumibles;
+------------+-------------------+-------+
| referencia | impresora         | stock |
+------------+-------------------+-------+
| ACME2598X  | ACME INKJET Ultra |     5 |
+------------+-------------------+-------+
1 row in set (0.00 sec)

¡Ahí la tenemos, nuestra flamante primera fila de la tabla!

Durante muchos años, todo lo que he sabido de SQL se reducía a este simple comando SELECT.

Seguro que no puedes esperar al momento de introducir el segundo registro. Ejecutamos un nuevo comando INSERT INTO:

mysql> INSERT INTO consumibles VALUES ( 'ACME4501Y', 'ACME PseudoJET Plus', 12 );
Query OK, 1 row affected (0.05 sec)

Venga, veamos cómo ha crecido la tabla:

mysql> SELECT * FROM consumibles;
+------------+---------------------+-------+
| referencia | impresora           | stock |
+------------+---------------------+-------+
| ACME2598X  | ACME INKJET Ultra   |     5 |
| ACME4501Y  | ACME PseudoJET Plus |    12 |
+------------+---------------------+-------+
2 rows in set (0.00 sec)

¡Impresionante! Sigue añadiendo filas hasta que te canses….

Vamos a rellenar otra de las tablas con la que hemos estado trabajando recientemente:

mysql> DESC fichajes;
+---------+------+------+-----+---------+-------+
| Field   | Type | Null | Key | Default | Extra |
+---------+------+------+-----+---------+-------+
| fecha   | date | YES  |     | NULL    |       |
| entrada | time | YES  |     | NULL    |       |
| salida  | time | YES  |     | NULL    |       |
+---------+------+------+-----+---------+-------+
3 rows in set (0.05 sec)

El propósito de esta tabla es registrar los momentos de fichaje en una empresa. Agreguemos el primer registro:

mysql> INSERT INTO fichajes VALUES ('2012-07-01', '07:32', '17:14');
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
+------------+----------+----------+
1 row in set (0.00 sec)

También es posible agregar varias filas en una única operación. Observa cómo lo hago:

mysql> INSERT INTO fichajes VALUES
    -> ('2012-07-02', '08:15', '17:57'),
    -> ('2012-07-03', '07:31', '16:30');
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

He pulsado ENTER después de VALUES para hacer el comando más legible. Observa que cada registro está contenido entre paréntesis, separando uno de otro mediante una coma.

Ejecutemos el comando estrella de SQL y veamos nuestra tabla con sus nuevos datos:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
+------------+----------+----------+
3 rows in set (0.00 sec)

mysql> exit
Bye

Javier Montero Gabarró


Insertando datos en nuestras tablas MySQL


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!