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!
Gracias, pero yo tengo una duda, si luego tengo otra pagina donde me pide por ejemplo uno de los campos que no había puesto (salida) y me que me salen en null, ¿como hago para que se registre el campo de esa determinada fila? o en otras palabras, terminar de completar la fila.
Aunque no incluyas datos en determinados campos, en la tabla sí aparecen registrados como NULL, como puedes comprobar realizando un simple SELECT.
La presentación de un campo NULL dependerá de la aplicación o de cómo exportes las tablas, siendo típicamente \N, la cadena vacía », o incluso la palabra NULL.
Saludos
hola, como puedo hacer para adicionar una columna y al mismo tiempo ingresar los datos en una sola sentencia?
Eddie, puedes usar ALTER TABLE para modificar la estructura de la tabla, indicando, si quieres, un valor DEFAULT, y después un INSERT para introducir valores, pero no todo junto.
¿Qué problema hay en ejecutar un comando y después el otro?
Próximamente escribiré nuevos artículos en la serie detallando estas cuestiones.
Saludos
Gracias Javier lo que pasa es que hay un profesor que me dijo que podemos hacer ambas cosas en una sola sentencia y nos mando a investigar como hacerlo
Conceptualmente es un tanto extraño lo que te pide, es una cuestión de diseño. En cualquier caso, cuando tengas la solución házmela llegar, por curiosidad.
Saludos
como puedo ingresar el dato que malto??? en este caso la hora de salida
No estoy seguro de entender tu duda. Imagino que te refieres a cómo realizar una inserción simple de datos.
Saludos
Despues de ingresar los datos menos el ultimo, el valor de éste se pone null, puedo insertar en ese «valor null» otro valor o solo se lo puede cambiar con update?
Disculpa, Diego, pero no logro entender tu duda…
¿Puedes indicarme un ejemplo concreto?
Hola, siguiendo los ejemplos, el servidor me arroja un error en la columna que no tiene registro, siendo que no lo mensione en INSER TO, el error es Field ‘rep_modo’ doesn’t have a default value. (http://www.procelservicios.cl/demo.php)
donde mi tabla tiene los campos, id_fecha, id_fechaauto, rep_sup, rep_area, rep_modo, rep_tipo, etc…
para probar solo queria ingresar fecha (id_fecha), nombre supervisor(rep_sup) y area(rep_area) y los demas campos en blanco.
nose como solucionarlo
no quiero hacer un ingreso de todos los campos que no tienen valor
y no quiero eleminar esos campos por que a veces tiene valor
saludos
Solucionado!, solo debia poner NULL en la estructura de la tabla opcion «predeterminado», en Myphpadmin.
Se nota mucho que recien estoy aprendiendo… 😉
Nadie se hace experto sin antes ser principiante. El camino está lleno de obstáculos a superar, pero uno a uno, con paciencia, los irás venciendo.
Saludos
Hola amigo, tengo una consulta.
En el 4to registro, es decir, donde la fecha es ‘2012-07-04’, y los valores de este registro son: | 2012-07-04 | 07:25:00 | NULL |.
¿como podria agregar a ESE registro especifico el horario de salida (campo null)?.
¿O una vez ingresado de esa forma ya no se puede volver a modificar?
Qué tal, Eric:
Simplemente, lanza un comando UPDATE sobre ese registro. No importa que haya NULLs. Consulta el siguiente artículo para una introducción básica.
Saludos
Hola Javier,
Tengo una duda, yo en mi caso tengo una tabla con dos columnas una que tiene una referencia de clientes del 1 hasta el 10 y la otra numeros de telefono. En este caso el cliente 2 puede tener un rango de telefonos como este 91 999 99 01 al 91 999 99 09. SI yo hiciese un insert into para esto como podría hacerlo?
Muchas gracias
Un saludo
Buenas tardes, Roberto:
Si la columna dos está definida como String, introducirías el valor de igual modo que si de un teléfono simple se tratase. Debes adaptar la entrada a la estructura definida de la tabla.
Saludos
Como puedo hacer una consulta MySQL omitiendo los campos NULL o Vacíos.
Tengo una base de datos que contiene una tabla con datos de usuarios, pero quiero hacer una consulta SQL en la cual pueda omitir los campos de usuarios que esten en blanco o tipo nullo.
Qué tal, Isaac:
Simplemente agrega una claúsula WHERE a tu SELECT indicándolo. Por ejemplo:
WHERE campo IS NOT NULL
Saludos
Hola mi problema es distinto,
necesito rellenar con null campos inexistentes de una tabla.
Es decir, una tabla alumnos con sus id, nombre, etc
otra tabla modulos con nombre_modulo, descripcion
y una tercera notas con id (alumno) nombre modulo (tabla modulos) nota (tabla notas)
Bien en esta tercera tabla notas solo algunos alumnos tienen algunas de las notas.
Lo que necesito es rellenar todos los campos de nota vacios con null.
Me estoy volviendo loco.
Alguna idea?
Gracias de ante mano.