3 Insertar, modificar y borrar

Veremos a continuación algunas de las características particulares de SQLite con respecto a las sentencias para insertar, modificar y eliminar datos.

Inserción de datos

Hay tres formatos para la sentecia INSERT. El más básico permite insertar una única fila de datos:

sqlite> INSERT INTO usuario (nombre,email) VALUES('Tulano','tulano@dominio.com');
sqlite>

En SQLite no existe el formato extendido de INSERT, de modo que será necesario insertar las filas una a una.

Si como en este caso, en la cláusula VALUES se indican valores para todas las columnas, se puede omitir la lista de columnas. Cuando sea así, en la lista dentro de VALUES deben aparecer tantos valores como columnas existan en la tabla, y el orden de asignación será de izquierda a derecha:

sqlite> INSERT INTO usuario VALUES('Sillano','sillano@dominio.com');
sqlite>

Si en la lista de columnas se omite alguna, a las columnas que falten se les asignará el valor por defecto, si se indicó alguno al crear la tabla, o NULL, si no se indicó ninguno.

sqlite> INSERT INTO usuario (nombre) VALUES('Cascasano');
sqlite> .nullvalue NULL
sqlite> SELECT * FROM usuario;
Fulano|fulano@dominio.com
Mengano|mengano@dominio.com
Tulano|tulano@dominio.com
Sillano|sillano@dominio.com
Cascasano|NULL
sqlite>

Nota: Hemos usado el comando .nullvalue para que se muestre la cadena "NULL" cuando el dato a mostrar para una columna sea NULL.

Insertar desde otra tabla

Es posible hacer inserciones masivas desde selecciones, ya sean de datos de otras tablas, composiciones, etc.

sqlite> CREATE TEMP TABLE copia AS SELECT * FROM compra WHERE 0;
sqlite> INSERT INTO copia SELECT * FROM compra;
sqlite> SELECT * FROM copia;
1|Tomates|2
4|Patatas|5
sqlite>

Resolución de conflictos

En general es posible insertar filas repetidas en una tabla, aunque según la definición de bases de datos en una relación no pueden existir tuplas iguales.

Sin embargo, si definimos una clave primaria o un índice único la tabla se convierte en una relación, y es posible que se produzcan conflictos si se intenta insertar una fila con una clave repetida.

SQLite permite manipular los conflictos de inserción mediante la opción INSERT OR acción, donde acción puede ser:

  • ROLLBACK: Si estamos en el interior de una transacción y se produce un conflicto de inserción, se deshace la transacción actual.
  • ABORT: Esta es la acción por defecto, si se detecta un conficto la inserción se anula, pero la transacción permanece abierta, y las acciones anteriores a la inserción se mantienen.
  • REPLACE: Se sustituye la fila en conflicto por los nuevos valores.
  • FAIL: Parecido a ABORT, pero no se deshacen las acciones previas llevadas a cabo por la sentencia INSERT actual que ha provocado el conflicto.
  • IGNORE: Se ignora el conflicto, la inserción no se lleva a cabo y se continúa ejecutando la sentencia.

Modificar filas

Mediante la sentencia UPDATE podemos actualizar o modificar una o varias columnas de una tabla o de parte de ella.

Se puede aplicar la misma resolución de conflictos que con la sentencia INSERT, y también se puede añadir una cláusula WHERE para limitar el número de filas afectadas:

sqlite> UPDATE copia SET cantidad=cantidad*2;
sqlite> SELECT * FROM copia;
1|Tomates|4
4|Patatas|10
sqlite> UPDATE copia SET cantidad=cantidad-1 WHERE cantidad>8;
sqlite> SELECT * FROM copia;
1|Tomates|4
4|Patatas|9
sqlite>

Eliminar filas

No hay mucho que decir. La sentencia DELETE se usa para eliminar filas de una tabla. Se puede indicar una cláusula WHERE para limitar o seleccionar qué filas se borrarán:

sqlite> DELETE FROM copia WHERE cantidad>5;
sqlite> SELECT * FROM copia;
3|Tomates|4
sqlite>

También podemos borrar todas las filas de una tabla, si omitimos la cláusula WHERE:

sqlite> DELETE FROM copia;
sqlite> SELECT * FROM copia;
sqlite>