La forma
más directa de insertar una fila nueva en una tabla es mediante una sentencia INSERT. En la
forma más simple de esta sentencia debemos indicar la tabla a la que queremos
añadir filas, y los valores de cada columna. Las columnas de tipo cadena o
fechas deben estar entre comillas sencillas o dobles, para las columnas
númericas esto no es imprescindible, aunque también pueden estar
entrecomilladas.
INSERT INTO TRAMO
VALUES(057,'LA_VENTA_CHAMAPA','LA_VENTA,'LECHERIA','32.5');
sql> INSERT INTO gente VALUES ('Fulano','1974-04-12');
sql> INSERT INTO gente VALUES ('Mengano','1978-06-15');
sql> INSERT INTO gente VALUES
-> ('Teresa','2000-12-02'),
-> ('Pedro','1993-02-10');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM gente;
+---------+------------+
| nombre | fecha |
+---------+------------+
| Fulano | 1974-04-12 |
| Mengano | 1978-06-15 |
| Teresa | 2000-12-02 |
| Pedro | 1993-02-10 |
+---------+------------+
mysql>
Si no
necesitamos asignar un valor concreto para alguna columna, podemos asignarle el
valor por defecto indicado para esa columna cuando se creó la tabla, usando la
palabra DEFAULT:
mysql> INSERT INTO ciudad2 VALUES ('Manzanillo', DEFAULT)
mysql> SELECT * FROM ciudad2;
+---------+-------------+
| nombre | poblacion |
+---------+-------------+
| Manzanillo| 5000 |
+---------+-------------+
mysql>
En este caso, como habíamos definido un valor por defecto para
población de 5000, se asignará ese valor para la fila correspondiente a
'Manzanillo'.
Otra opción consiste en indicar una lista de columnas para las
que se van a suministrar valores. A las columnas que no se nombren en esa lista
se les asigna el valor por defecto. Este sistema, además, permite usar
cualquier orden en las columnas, con la ventaja, con respecto a la anterior
forma, de que no necesitamos conocer el orden de las columnas en la tabla para
poder insertar datos:
mysql> INSERT INTO ciudad5 (poblacion,nombre) VALUES
-> (7000000, 'México'),
-> (9000000, 'Pachuca'),
-> (3500000, 'Campeche');
mysql> SELECT * FROM ciudad5;
+-------+-----------+-----------+
| clave | nombre | poblacion |
+-------+-----------+-----------+
| 1 | México | 7000000 |
| 2 | Pachuca | 9000000 |
| 3 | Campeche | 3500000 |
+-------+-----------+-----------+
mysql>
Cuando creamos la tabla "ciudad5" definimos tres
columnas: 'clave', 'nombre' y 'poblacion' (por ese orden). Ahora hemos
insertado tres filas, en las que hemos omitido la clave, y hemos alterado el
orden de 'nombre' y 'poblacion'. El valor de la 'clave' se calcula
automáticamente, ya que lo hemos definido como auto-incrementado.
Existe otra sintaxis alternativa, que consiste en indicar el
valor para cada columna:
mysql> INSERT INTO ciudad5
-> SET nombre='Guadalajara', poblacion=8000000);
mysql> SELECT * FROM ciudad5;
+-------+--------------+-----------+
| clave | nombre | poblacion |
+-------+--------------+-----------+
| 1 | México | 7000000 |
| 2 | Pachuca | 9000000 |
| 3 | Campeche | 3500000 |
| 4 | Guadalajara | 8000000 |
+-------+--------------+-----------+
mysql>
Una vez
más, a las columnas para las que no indiquemos valores se les asignarán sus
valores por defecto. También podemos hacer esto usando el valorDEFAULT.
Para las
sintaxis que lo permiten, podemos observar que cuando se inserta más de una
fila en una única sentencia, obtenemos un mensaje desde MySQLque indica el número de
filas afectadas, el número de filas duplicadas y el número de avisos.
Para que una fila se considere duplicada debe tener el mismo
valor que una fila existente para una clave principal o para una clave única.
En tablas en las que no exista clave primaria ni índices de clave única no
tiene sentido hablar de filas duplicadas. Es más, en esas tablas es
perfectamente posible que existan filas con los mismos valores para todas las
columnas.
Por
ejemplo, en mitabla5 tenemos una clave única sobre la
columna 'nombre':
mysql> INSERT INTO mitabla5 (id, nombre) VALUES
-> (1, 'Carlos'),
-> (2, 'Felipe'),
-> (3, 'Antonio'),
-> (4, 'Carlos'),
-> (5, 'Juan');
ERROR 1062 (23000): Duplicate entry 'Carlos' for key 1
mysql>
Si
intentamos insertar dos filas con el mismo valor de la clave única se produce
un error y la sentencia no se ejecuta. Pero existe una opción que podemos usar
para los casos de claves duplicadas: ON
DUPLICATE KEY UPDATE. En este caso podemos indicar a MySQL qué debe hacer si se intenta insertar
una fila que ya existe en la tabla. Las opciones son limitadas: no podemos
insertar la nueva fila, sino únicamente modificar la que ya existe. Por
ejemplo, en la tabla 'ciudad3' podemos usar el último valor de población en
caso de repetición:
mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES
-> ('México', 7000000);
mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES
-> ('Pachuca', 9000000),
-> ('México', 7200000)
-> ON DUPLICATE KEY UPDATE poblacion=VALUES(poblacion);
mysql> SELECT * FROM ciudad3;
+--------+-----------+
| nombre | poblacion |
+--------+-----------+
| México | 7200000 |
| Pachuca| 9000000 |
+--------+-----------+
mysql>
En este ejemplo, la
segunda vez que intentamos insertar la fila correspondiente a 'Madrid' se usará
el nuevo valor de población. Si en lugar deVALUES(población) usamos población el nuevo valor de
población se ignora. También podemos usar cualquier expresión: mysql> INSERT
INTO ciudad3 (nombre, población) VALUES
-> ('Pachuca', 9100000)
-> ON DUPLICATE KEY UPDATE poblacion=poblacion;
Query OK, 2 rows affected (0.02 sec)
mysql> SELECT * FROM ciudad3;
+--------+-----------+
| nombre | poblacion |
+--------+-----------+
| México | 7200000 |
| Pachuca| 9000000 |
+--------+-----------+
2 rows in set (0.00 sec)
mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES
-> ('Pachuca', 9100000)
-> ON DUPLICATE KEY UPDATE poblacion=0;
mysql> SELECT * FROM ciudad3;
+--------+-----------+
| nombre | poblacion |
+--------+-----------+
| México | 7200000 |
| Pachuca| 0 |
+--------+-----------+
mysql>
Reemplazar filas
Existe una
sentencia REPLACE, que es
una alternativa para INSERT, que sólo
se diferencia en que si existe algún registro anterior con el mismo valor para
una clave primaria o única, se elimina el viejo y se inserta el nuevo en su
lugar.
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES (,...),(...),...
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name=, ...
mysql> REPLACE INTO ciudad3 (nombre, poblacion) VALUES
-> ('México', 7200000),
-> ('Pachuca', 9200000),
-> ('Campeche', 6000000);
mysql> SELECT * FROM ciudad3;
+--------+-----------+
| nombre | poblacion |
+----- ---+-----------+
| Campeche | 6000000 |
| México | 7200000 |
| Pachuca | 9200000 |
+----------+-----------+
mysql>
En este ejemplo se sustituyen las filas correspondientes a
'Madrid' y 'París', que ya existían en la tabla y se inserta la de 'Berlín' que
no estaba previamente.
mysql> REPLACE INTO ciudad3 VALUES ('Guadalajara', 9500000);
mysql> REPLACE INTO ciudad3 SET nombre='Durango', poblacion=10000000;
Mysql> SELECT * FROM ciudad3;
+--------------+-----------+
| nombre | poblacion |
+--------------+-----------+
| Campeche | 6000000 |
| Durango | 10000000 |
| México | 9200000 |
| Pachuca | 9500000 |
+---------+-----------+
mysql>
No hay comentarios:
Publicar un comentario