Vamos a prepararnos. Tienes el fichero de órdenes SQL (E2Cinsert.txt): selecciona todo y copia.
Abrimos HeidiSQL. Nos vamos a "consulta" y pegamos.
Ahora puedes abrir una segunda instancia de HeidiSQL —abre otro HeidiSQL—.
A lo nuestro. Insertar filas es la operación básica para rellenar de datos nuestras tablas. Se inserta fila a fila, aunque pueda parecer que no. Y las filas, evidentemente, enteras, aunque el sistema se encargue de lo que falte.
Creamos una base de datos.
-- creando espacio de trabajo
drop database if exists probando;
create database probando;
-- seleccionando la base de datos
use probando;
La tabla en la que vamos a probar las inserciones es "prueba". Tiene 3 columnas. La primera, "id", es de tipo entero pequeño. La segunda, "colA", de tipo carácter variable y largo 15. La tercera, "colB", de tipo fecha. La clave primaria es "id". Decimos explícitamente que el valor por defecto para "colB" es el nulo:
-- creación de las tablas de prueba
CREATE TABLE prueba (
id smallint,
colA varchar(15),
colB date DEFAULT NULL,
PRIMARY KEY (id)
);
La segunda instancia la vamos a utilizar para comprobar el contenido de la tabla. De esta manera la tenemos visible en todo momento. Escribe en la pestaña de consulta:
select * from probando.prueba;
Pulsa F9 y en el panel de resultados verás únicamente el encabezado de la tabla; la tabla está vacía, aún no hemos insertado nada.
A partir de ahora, la mayoría de las veces que ejecutemos algo en la izquierda, verás que a continuación ejecutamos la consulta en la de la derecha para ver el resultado.
Volvemos a la izquierda y seleccionamos las dos inserciones de fila. Con CTRL-F9 se ejecuta solo lo seleccionado.
INSERT INTO prueba VALUES (10, 'fila1','2016-10-12');
INSERT INTO prueba VALUES (11, 'fila2','2016-10-12');
La orden para insertar es INSERT INTO. A continuación, el nombre de la tabla donde queremos insertar. Solo podemos poner un nombre de tabla. Solo podemos insertar en una tabla cada vez.
A continuación VALUES. No es opcional cuando le damos nosotros los valores de la fila.
Los valores de la fila, entre paréntesis y separados por comas. Tienes que respetar el orden de las columnas en la tabla. Once (11) es para la columna "id", 'fila' para "colA y '2016-10-12' para colB.
Fíjate que los números van sin comillas, las cadenas de caracteres y las fechas van con entrecomillado simple. Además, si no hemos reconfigurado el servidor, el formato de fecha es año, mes y día.
Es cierto que los servidores son capaces de entendernos la mayoría de las veces que escribimos mal. Por ejemplo, si hubiéramos entrecomillado el once ('11') MariaDB se las quitaría internamente y lo interpretaría como un entero pequeño. Eso porque ese dato va a la columna "id".
Sin embargo, si hubiéramos cambiado ese 11 por 'A1', MariaDB no sabría qué hacer, saltaría un error y nos negaría la inserción.
Conclusión: siempre, siempre respeta lo que es número y lo que no lo es, no pongas comillas porque sí o porque no te importa. Siempre importa!
Esto, aunque no lo parezca, son 3 inserciones de fila. Lo que pasa es que algunos servidores permiten compactar la orden separando las filas, entre paréntesis cada una, con comas:
INSERT INTO prueba VALUES
(12, 'fila3','2016-10-12'),
(13, 'fila4','2016-10-12'),
(14, 'fila5','2016-10-12');
Si faltan datos, dará error y no permitirá la inserción:
INSERT INTO prueba values (15);
Cuando no queremos especificar todos los valores o lo queremos hacer en otro orden, podemos dar las columnas concretas donde se insertará. Aquí, por ejemplo, solo vamos a dar valor a la columna "id":
INSERT INTO prueba (id) values (16);
Fíjate que en las otras dos columnas ha puesto nulos:
Ahora damos valores a 2 columnas:
INSERT INTO prueba (id,colB) values (17, '2017-01-01');
Ahora a 2 columnas y en distinto orden. Fíjate que los valores respetan el orden, los tipos de datos esperados:
INSERT INTO prueba (colA,id) values ('fila9', 18);
Aunque utilicemos todas las columnas, y aunque lo hagamos en el orden definido —que no es este el caso—, muchas veces es preferible dar todos los nombres, simplemente por tenerlo más claro nosotros:
INSERT INTO prueba (colB,colA,id) values ('2017-01-01', 'fila10', 19);
En cualquier caso, no dar valor a una columna estará permitido o no, depende de cómo la hayamos definido. Por ejemplo, vamos a redefinir la tabla añadiendo una restricción de "no nulo" a la segunda columna:
drop table prueba;
CREATE TABLE prueba (
id smallint,
colA varchar(15) not null,
colB date,
PRIMARY KEY (id)
);
Si probamos de nuevo las inserciones anteriores, ésta falla porque no hemos dado valor a "colA" y no hemos definido un valor por defecto alternativo:
INSERT INTO prueba (id) values (16);
Esta fallará por la misma razón:
INSERT INTO prueba (id,colB) values (17, '2017-01-01');
En esta sí estamos dándole un valor a colA. ColB recibe un nulo:
INSERT INTO prueba (colA,id) values ('fila9', 18);
Cuando se permiten nulos, el valor por defecto es NULL y el servidor lo usa automáticamente aunque no hayamos utilizado la restricción DEFAULT. Si la columna es not null —explícitamente o por ser clave primaria— entonces no hay valor por defecto. En cualquier caso no está de más especificar los valores por defecto aunque no lo consideremos necesario.
Aquí vuelven a ser todas las columnas aunque en distinto orden:
INSERT INTO prueba (colB,colA,id) values ('2017-01-01', 'fila10', 19);
Redefinamos la tabla dando valor por defecto a colA:
drop table prueba;
CREATE TABLE prueba (
id smallint,
colA varchar(15) not null default 'sinValor',
colB date default null,
PRIMARY KEY (id)
);
Probamos de nuevo:
INSERT INTO prueba (id) values (16);
INSERT INTO prueba (id,colB) values (17, '2017-01-01');
Estas dos órdenes fallaban antes porque el sistema no sabía qué valor darle a colA. Ahora sí lo sabe, le hemos dicho que utilice la cadena 'sinValor'. El resto de órdenes funcionan igual que antes:
INSERT INTO prueba (colA,id) values ('fila9', 18);
INSERT INTO prueba (colB,colA,id) values ('2017-01-01', 'fila10', 19);
Hemos dicho que la palabra reservada VALUES es obligatoria. Lo es salvo que extraigamos los datos de otra tabla mediante una consulta.
Creamos una segunda tabla, "prueba2", con 2 columnas:
CREATE TABLE prueba2 (
col1 smallint,
col2 date default null,
PRIMARY KEY (col1)
);
E insertamos sacando los datos de la tabla "prueba". Fíjate en la derecha de tu pantalla, este es el contenido actual de la tabla.
insert into prueba2 (col1,col2) select id,colB from prueba;
En vez de poner VALUES y una lista de valores separados por comas, hemos escrito una consulta: "dame todo lo que tengas en las columnas id y colB de la tabla prueba".
Hay que tener cuidado con que el resultado de la consulta devuelva la misma cantidad de columnas, y los mismos tipos de datos en el mismo orden.
Se puede, incluso, crear una tabla a partir de una consulta, sin definir ninguna columna ni restricción.
create table prueba3 select id,colB,colA from prueba;
También es cierto que se crean las columnas pero no algunas restricciones como la clave primaria.
Terminamos. Borramos todo por limpieza.
drop database probando;