Funciones Avanzadas de PostgreSQL para Optimización de Aplicaciones
Resumen
¿Cuáles son las funciones especiales de PostgreSQL?
PostgreSQL es conocido por su robustez y flexibilidad, y una de sus características distintivas son sus funciones especiales. Estas funciones están diseñadas para facilitar el desarrollo y administración eficaces de tus aplicaciones. Aquí te explicaremos algunas de las funciones especiales más útiles: ON CONFLICT, RETURNING, LIKE, ILIKE, e IS/IS NOT.
¿Cómo funcionan ON CONFLICT y DO NOTHING/DO UPDATE?
Las operaciones de inserción pueden ser más complejas cuando ya existe un dato con la clave primaria o única que intentas insertar. El comando ON CONFLICT te permite manejar estos escenarios:
DO NOTHING: No realiza ningún cambio si ya existe un conflicto.
La función RETURNING es especialmente útil cuando queremos obtener resultados inmediatamente después de una inserción. Esto es beneficioso para confirmar los datos ingresados o para recoger identificadores generados automáticamente, como en campos tipo serial.
%: para representar cualquier cadena de caracteres.
_: para representar cualquier carácter individual.
¿Cuándo utilizamos IS NULL o IS NOT NULL?
Las comparaciones con NULL no se realizan como las de tipo numérico o alfanumérico, debido a que NULL no es un tipo de dato estándar. Las funciones IS NULL y IS NOT NULL son esenciales para verificar si un campo en particular tiene un valor.
Para verificar NULL:
SELECT*FROM trains WHERE model ISNULL;
Para verificar no NULL:
SELECT*FROM trains WHERE model ISNOTNULL;
Estas expresiones son de gran ayuda si necesitas comprobar la presencia o ausencia de datos en columnas.
El optimizar tus consultas SQL no solo mejora la eficiencia sino también la consistencia de los datos procesados. Invierte tiempo en aprender y experimentar estas funciones, ya que enriquecerán tu habilidad en la gestión de bases de datos PostgreSQL. ¡Sigue adelante y no dejes de buscar más conocimiento para perfeccionar tu manejo de este poderoso sistema!
Returning nos devuelve una consulta select de los campos sobre los que ha tenido efecto la instruccion.
Ejemplo: Queremos saber cual es el id que le fue asignado a un dato insertado.
INSERTINTO tren (modelo, capacidad)VALUES('modelo x',100)RETURNING id;/*
Opcionalmente tambien puedes solicitar todos los campos o alguno de ellos
*/INSERTINTO tren (modelo, capacidad)VALUES('modelo x',100)RETURNING id;INSERTINTO tren (modelo, capacidad)VALUES('modelo x',100)RETURNING id, capacidad;
Like / Ilike
Las funciones like y ilike sirven para crear consultas a base de expresiones regulares.
Like considera mayusculas y minusculas, mientras que ilike solo considera las letras.
Ejemplo: Busquemos a los pasajeros con nombre que terminen con la letra o
-- Usando LIKESELECT*FROM PASAJERO
WHERE pasajero.nombre LIKE'%O'-- No devulve nada, porque ningun nombre terminara con una letra mayuscula-- Usando ILIKESELECT*FROM PASAJERO
WHERE pasajero.nombre LIKE'%O'-- Devolvera los nombres que terminen con o, independiente si es mayuscula o minuscula.
IS / IS NOT
Permite hacer comprobacion de valores especiales como null
Ejemplo: Consultemos a todos los usuarios que tengan como direccion_residencia NULL
-- IS
SELECT * FROM PASAJERO
WHERE pasajero.nombre IS null;
Ahora a los que si tengan la direccion_recidencia con algun valor
-- IS NOTSELECT*FROM PASAJERO
WHERE pasajero.nombre ISNOTnull;
Un resumen genial
Me alegra que te gustara! Un saludo ODCenteno
No lo mencionó el profesor bien en esta clase a mi parecer, pero investigando un poco, cuando haya un conflicto de id con el INSERT, podemos actualizar la tupla correspondiente con los nuevos valores usando la palabra EXCLUDED, de la siguiente manera:
INSERTINTO tren
VALUES(1,'Modelo modificado',1000)ONCONFLICT(id)DOUPDATESET modelo =EXCLUDED.modelo, capacidad =EXCLUDED.capacidad;
Porque el profesor escribió a mano los nuevos valores de actualización en el SET, y eso no tiene ningún sentido en el caso de que esta actualización de tuplas a partir del conflicto de id sea ya un proceso automatizado.
Muy buen aporte @Aldo, asi se evita el hardcoding y se hace una consulta mas integra.
Excelente aporte, investigaré más sobre el comando EXCLUDED
La función RETURNING es fundamental en la creación y uso de Stored procedure transaccionales. Al momento de insertar información con id autoincremental, con RETURNING podemos obtener dicho valor e insertarlo o referenciarlo en otras tablas.
Bastante útil ya que de otra manera tendríamos que hacer un query para saber el ID, así ahorramos tiempo.
Vea pues!
Al fin se fue el fondo rojo :D
Así es!!
Funciones especiales
ON CONFLICT DO
RETURNING
LIKE / ILIKE
IS / IS NOT
--Insercion de un dato que ya existe, no pasa nada
INSERTINTOpublic.estacion(id, nombre, direccion)VALUES(1,'Nombre','Dire')ONCONFLICTDONOTHING;--Insercion de un dato que ya existe, te cambia los campos de nombre y direccion
INSERTINTOpublic.estacion(id, nombre, direccion)VALUES(1,'Nombre','Dire')ONCONFLICT(id)DOUPDATESET nombre ='Nombre', direccion ='Dire';--Insertara una tupla y mostrara la tupla
INSERTINTOpublic.estacion(nombre, direccion)VALUES('RETU','RETDIRE')RETURNING*;--%:Uno o cualquier valor
-- _:Un valor
SELECT nombre FROMpublic.pasajeroWHERE nombre LIKE'o%';-- buscamos sin importar mayusculas o minusculas
SELECT nombre FROMpublic.pasajeroWHERE nombre ILIKE'o%';-- si una estacion o tren tiene un valor nulo
SELECT*FROMpublic.trenWHERE modelo ISNULL;
Mi resumen
Existen 4 funciones especiales que nos ayudarán en nuestro día a día estas son
ON CONFLICT DO: Es una especie de sobre escritura sobre algo que ya este creado "Como un UPDATE"
RETURNING: Muestra en pantalla el último cambio hecho
LIKE / ILIKE: Busqueda por similitudes la diferencia entre ambas es que like busca en minusculas y ilike busca mayusculas/minisculas
IS / IS NOT: comparacion para atributos especiales como el NULL
Compañeros en este link se explica muy bien la primer función. Se entiende la diferencia entre update y on confilct do.
Yo la funcionalidad que le veo a ON CONFLICT DO es que dentro de un ciclo Insertaría o actualizaría los datos si ya existen:
Esto ayuda ya que para insertar tendría que hacer un script y para actualizar realizaría otro.
--/////////////////--19.FuncionesEspecialesPrincipales--/////////////--ONCONCLICTDOSELECT*FROM estacion;--ONCONFLICTDONOTHING--Sí el registro existe, no hace nada pero sí el registro no existe lo crea
INSERTINTOpublic.estacion(id,nombre,direccion)VALUES(350,'xxx','xxx')ONCONFLICTDONOTHING;SELECT*FROM estacion;--ONCONFLICTDOUPDATESET--Sí el registro existe lo actuliza, sí no existe lo crea
INSERTINTOpublic.estacion(id,nombre,direccion)VALUES(350,'xxx','xxx')ONCONFLICT(id)DOUPDATESET id =102,nombre ='San francisco ',direccion ='46 howlang';SELECT*FROM estacion;--RETUNING--RETURNING*|RETURNING name_column
--Una vez insertamos el valor este no los devuelve muy útil para no usar un SELECT.INSERTINTOpublic.estacion(nombre,direccion)VALUES('New York Station',' 49 Muir Way')RETURNING*--IS/ISNOT--IS/ISNOT, nos permite comparar tipos de datos que no son estándar o son objetos.--NULL es un tipo de dato NOESTÁNDARSELECT*FROMpublic.estacionWHERE estacion ISNOTNULL;
ON CONFLICT DO se me parece al try: except: de python.
Para ser precisos: LIKE / ILIKE / IS / IS NOT son operadores, no funciones.
Tenía esta duda!
Hasta que por fin le quitó ese color!!! :D
Que hermoso ya quiero usar únicamente postgreSQL
Me parece excelente, aunque hasta ahora me sigue gustando más MySQL.
más información sobre estas funciones en la documentación oficial de PostgreSQL:
... si de pronto está molestado este colo ROJO.....
jajajaja, ya me tenia desesperado ese Rojo xD
El LIKE se puede usar con números, previamente pasados a string. Usando por ejemplo “::text”.
De esta manera se pueden hacer búsquedas bastante particulares como por ejemplo encontrar un número que empiece con 2 y tenga al menos 3 dígitos.
SELECT numero FROM tabla_numeros WHERE numero::text LIKE '2_%_%'
https://www.tutorialspoint.com/postgresql/postgresql_like_clause.htm
ON CONFLICT DO: Ayuda a solucionar problemas cuando se insertan o modifican datos en una tabla y no se pueda. Despues, se hace la actualizacion correcta. Si por ejemplo se quiere insertar un dato que ya existe, on conflict do ayuda a insertar si lo que realmente se quiere es actualizar.
RETURNING: Permite devolver todos los cambios que se han hecho sobre la BD. Devolver no es devolver hacia atras, o deshacer, sino retornar la informacion cuando por ejemplo se hace un insert y esto sirve para confirmar que todo quedo bien. Si hay un caso tipo serial, retorna el valor asignado.
LIKE/ILIKE: Sirve para hacer busquedas al estilo de expresiones regulares donde se puede probar por ejemplo buscar nombres que empiecen por una letra en particular
IS/IS NOT Permite comparar dos tipos de datos que no son especiales sino que por ejemplo son numericos o alfanumericos. Permite saber si un campo es nulo o no.
Lo único que veo de diferente entre UPDATE y CONFLICT ON es que UPDATE modifica un dato dependiendo de una condición y CONFLICT ON lo hace atraves de error. Puede sonar igual porque las actualizaciones lo hacemos dependiendo del ID que es único, pero pensemos en el momento en que debamos modificar por ejemplo cambiar PESOS COLOMBIANOS a COP ahí utilizamos UPDATE, y ahora pensemos en donde insertemos y en el espacio de moneda, tu no tienes ideas de que si es PESOS COLOMBIANOS o COP, entonces para estar prevenido de que no vas a perder el tiempo en la línea 500 haces de tu INSERT lo prevines con esto.
En otras palabras CONFLICT ON sirve para prevenir errores
Se me ocurre que el RETURNING sirve al momento de que se crea un usuario en la UI, mostrar toda su información y pintarla al momento sin tener que recargar la página. Si no que mas bien se estaría actualizando el estado.