Añadir filas con INSERT en MySQL

En primer lugar añadiremos filas con INSERT, una instrucción SQL en la que debe especificar la tabla en la que añadir la fila y qué datos incluirá. La instrucción INSERT tiene varias formas.

Puede especificar valores para todas las columnas. La sintaxis para llevar a cabo esta operación es la siguiente:

INSERT INTO nombre_tabla VALUES (valor1, valor2,...);

Ejemplo:

mysql> INSERT INTO student VALUES('Kyle', 'M', NULL);
mysql> INSERT INTO grade_event VALUES('2008-09-03','Q',NULL);

Con esta sintaxis, la lista VALUES debe incluir un valor para cada columna de la tabla, en el orden en que se hayan almacenado. Por lo general, es el orden en que se especifican en la instrucción CREATE TABLE de la tabla. Si desconoce el orden, ejecute DESCRIBE nombre_tabla para saberlo.

En MySQL, puede incluir cadenas y fechas encerrándolas entre comillas simples o dobles, aunque las simples son más habituales. Los valores NULL son para las columnas AUTO_INCREMENT de las tablas student y grade_event. Si añade un valor ausente en una columna AUTO_INCREMENT, MySQL genera el siguiente número secuencial para la columna.

MySQL le permite añadir varias filas con una sola instrucción INSERT, si especifica varias listas de valores:

INSERT INTO nombre_tabla VALUES(...),(...),... ;

Ejemplo:

mysql> INSERT INTO student VALUES ('Avery','F',NULL),('Nathan','M',NULL);

Necesita escribir menos y es más eficaz en cuanto a ejecución en el servidor. Los valores de columna para cada fila se incluyen entre paréntesis. La siguiente instrucción no es válida ya que no contiene el número correcto de valores estre paréntesis:

mysql> INSERT INTO student VALUES('Avery','F',NULL,'Nathan','M',NULL);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

Puede asignar el nombre a las columnas en las que añadir valores y después enumerar los valores. Resulta muy útil para crear un registro en el que sólo hay que configurar una serie de columnas inicialmente.

INSERT INTO nombre_tabla (nombre_col1,nombre_col2,...) VALUES (valor1,valor2,...);

Ejemplo:

mysql> INSERT INTO member (last_name,first_name) VALUES('Stein','Waldo');

Esta forma de INSERT también permite varias listas de valores:

mysql> INSERT INTO student (name,sex) VALUE('Abby','F'),('Joseph','M');

A las columnas sin nombre en la lista de columnas, MySQL asigna su valor predeterminado. Por ejemplo, las instrucciones anteriores no contienen valores para las columnas member_id o student_id, por lo que MySQL asigna el valor predeterminado NULL. member_id y student_id son columnas AUTO_INCREMENT, por lo que en cada caso, el efecto es generar y asignar el siguiente número secuencial, como si hubiera asignado NULL explícitamente. Puede proporcionar una lista de asignaciones de columna y valor. Esta sintáxis utiliza una cláusula SET con asignaciones nombre_columna=valor en lugar de una lista VALUES():

INSERT INTO nombre_tabla SET nombre_columna=valor1,nombre_columna2=valor2, ... ;

Ejemplo:

mysql> INSERT INTO member SET last_name='Stein',first_name='Waldo';

A las columnas sin nombre de la cláusula SET, MySQL le asigna su valor predeterminado. Esta forma de INSERT no se puede emplear para añadir varias filas en una misma instrucción.

Ahora que ya sabe cómo funciona INSERT, puede utilizarlo para comprobar si las relaciones de clave secundaria evitan filas incorrectas en las tablas score y absence. Intente añadir filas que contengan valores ID que no estén presentes en las tablas grade_event y student:

mysql> INSERT INTO score (event_id,student_id,score) VALUES(9999,9999,0);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails ('sampdb'.'score', CONSTRAINT 'score_ibfk_1' FOREIGN KEY ('event_id') REFERENCES 'grade_event' ('event_id'))
mysql> INSERT INTO absence SET student_id=9999, date='2008-09-16';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails ('sampdb'.'absence', CONSTRAINT 'absence_ibfk_1' FOREIGN KEY ('student_id') REFERENCES 'student' ('student_id'))

Los mensajes de error demuestran que las restrincciones funcionan.

Añadir nuevas filas desde una archivo en MySQL

Otro método para añadir filas a una tabla consiste en leerlas directamente desde una archivo, que puede incluir instrucciones INSERT o datos sin procesar. Por ejemplo, la distribución sampdb contiene el archivo insert_ president.sql, con instrucciones INSERT para añadir nuevas filas a las tabla president. Si se encuentra en el mismo directorio que el archivo, puede ejecutar las instrucciones de esta forma:

% mysql sampdb < insert_president.sql

Si ya ha ejecutado mysql, puede utilizar un comando source para leer el archivo:

mysql> source insert_president.sql;

Si ha almacenado las filas como datos sin procesar en lugar de instrucciones INSERT, puede cargarlas con instrucciones LOAD DATA o con el programa cliente mysqlimport. La instrucción LOAD DATA lee los datos del archivo y se utilizar desde mysql:

mysql:
mysql> LOAD DATA LOCAL INFILE 'member.txt' INTO TABLE member;

Si el archivo de datos member.txt se encuentra en el directorio actual del cliente, la instrucción lo lee y envía sus contenidos al servidor para cargarlos en la tabla member. (El archivo member.txt se encuentra en la distribución sampdb.)

De forma predeterminada, la instrucción LOAD DATA asume que los valores de columna están separados por tabuladores y que las líneas acaban en salto de línea. También que los valores se presentan en el mismo orden que las columnas de la tabla. Se pueden leer archivos en otros formatos o especificar un orden de columnas diferente.

La palabra clave LOCAL de la instrucción LOAD DATA hace que el programa cliente lea el archivo y se envíe al servidor. Puede omitir LOCAL pero el archivo tendría que encontrarse en el servidor y necesitaría el privilegio de acceso FILE, que la mayoría de usuarios MySQL no tienen. También debe especificar el nombre de ruta completo al archivo para que el servidor pueda localizarlo.

Si se genera el siguiente error con LOAD DATA LOCAL, puede que la función LOCAL esté deshabilitada de forma predeterminada:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

Pruebe invocar mysql con la opcion –local-infile. Por ejemplo:

% mysql --local-infile sampdb
mysql> LOAD DATA LOCAL INFILE 'member.txt' INTO TABLE member;

Si tampoco funciona, tendrá que indicar al servidor que habilite LOCAL.

Otra forma de cargar el archivo consiste en utilizar el programa cliente mysqlimport, que se invoca desde la línea de comandos y genera una instrucción LOAD DATA:

% mysqlimport --local sampdb member.txt

Como sucede con mysql, debe indicar los parámetros de conexión en la línea de comandos por delante del nombre de la base de datos.

En este caso, mysqlimport genera una instrucción LOAD DATA para cargar member.txt en la tabla member. Determina el nombre de la tabla del nombre del archivo de datos, utilizando todo lo que aparece hasta el primer punto. Por ejemplo, mysqlimport carga los archivos member.txt y president.txt en las tablas member y president. Por ello, debe elegir adecuadamente los nombres de archivo o mysqlimport no utilizará el nombre de la tabla correcto. Si desea cargar los archivos member1.txt y member2.txt, mysqlimport intentará cargarlos en las tablas member1 y member2. Si realmente quiere añadirlos a la tabla member, debería utilizar los nombres member.1.txt y member.2.txt o member.txt1 y member.txt2.

Comparte