El Blog de over…

enero 15, 2008

Transacciones en PostgreSQL

Filed under: ./base\ de\ datos — elblogdeover @ 4:42 am

Las transacciones son un concepto fundamental en todos los sistemas de base de datos, el punto esencial de una transaccion es que engloba multiples operaciones en un solo paso. Por ejemplo, considere la base de datos de un banco que contiene balances para varias cuentas de clientes, supongamos que queremos registrar el pago de $100 desde la cuenta de Alice hacia la cuenta de Bob, las sentencias SQL a ejecutar para esta operacion serian como la siguiente:

UPDATE cuentas SET balance = balance – 100 WHERE nombre = ‘Alice’;
UPDATE branches SET balance = balance – 100 WHERE nombre = (SELECT branch_name FROM cuentas WHERE nombre = ‘Alice’);
UPDATE cuentas SET balance = balance + 100 WHERE nombre = ‘Bob’;
UPDATE branches SET balance = balance + 100 WHERE nombre = (SELECT branch_name FROM cuentas WHERE nombre = ‘Bob’);

Como se puede observar hay varias actualizaciones involucradas para terminar la operacion, los operadores del bando deben estar seguros de que todas esas actualizaciones se ejecuten, o en caso de falla que ninguna se ejecute, ya que se podria dar el caso de que Bob reciba $100 sin que sean debitados de la cuenta de Alice, Agrupando las actualizaciones en una sola transaccion se puede garantizar que en caso de un fallo ninguna actualizacion se ejecute.

En PostgreSQL las transacciones se configuran simplemente encerrando en un bloque las operaciones que se desean incluir en la misma, el bloque debe comenzar y terminar con los comandos BEGIN y COMMIT, por ejemplo:

BEGIN;
UPDATE cuentas SET balance = balance – 100 WHERE nombre = ‘Alice’;

COMMIT;

Al momento que se le pasa a postgresql la clausula COMMIT es cuando se escribe en base de datos las actualizacione u operacion que se desea hacer en la misma, si en algun momento no queremos hacer COMMIT de alguna operacion (quizas se nota que la cuenta de Alice da un balance negativo) entonces se puede utilizar la clausula ROLLBACK y todas las actualizaciones dentro de la transaccion se cancelaran.

Si no se desea hacer un rollback completo de la transaccion, entonces se pueden definir marcadores (savepoints) hasta los cuales se desea que se regrese en la transaccion, ejemplo:

BEGIN;
UPDATE cuentas SET balance = balance – 100 WHERE nombre = ‘Alice’;
SAVEPOINT marcador1;
UPDATE cuentas SET balance = balance + 100 WHERE nombre = ‘Bob’;
— se desea descartar la actualizacion para Bob y en vez hacerla para Wally —
ROLLBACK TO marcador1;
UPDATE cuentas SET balance = balance + 100 WHERE nombre = ‘Wally’;
COMMIT;

En el ejemplo anterior se vio el uso de Marcadores y Rollbacks, en este caso lo que paso es que se realizo una actualizacion sobre la cuenta de Bob, pero a ultima instacia se decide que el dinero no se le va a abonar a Bob sino a Wally, entonces se realiza un rollback hasta el marcador llamado marcador1 y se pasa a hacer la actualizacion en la cuenta de Wally.

Anuncios

diciembre 25, 2007

Diferencia entre la clausula WHERE y HAVING en SQL

Filed under: ./base\ de\ datos — elblogdeover @ 6:42 pm

Es importante entender la forma en como las clausulas WHERE y HAVING actuan sobre las funciones de agregacion y agrupacion en SQL, la diferencia fundamental entre WHERE y HAVING es la siguente: WHERE selecciona las filas a mostrar antes de que sean agrupadas o procesadas por una funcion de agregacion, mientras HAVING selecciona las filas despues de que estas hayan sido procesadas o computadas, por lo tanto, la clausula WHERE no debe contener funciones de agrupacion o agregacion, mientras que la clausula HAVING siempre contiene funciones de agregacion, es permitido escribir clausulas HAVING que no contengan agrupacion, pero rara vez es util, la misma condicion podria ser usada mas eficientemente en la clausula WHERE

Ejemplos:

SELECT ciudad FROM tiempo WHERE baja_temp = max(baja_temp);

El ejemplo mostrado anteriormente es una mala formulacion de una clausula WHERE porque contiene una funcion de agregacion y esto no es permitido. La reformulacion de esta clausula seria la siguiente:

SELECT ciudad FROM tiempo WHERE baja_temp = (SELECT max(baja_temp) FROM tiempo);

La consulta de arriba nos trae como resultado la ciudad con la mayor temperatura baja registrada.

SELECT ciudad, max(baja_temp) FROM tiempo GROUP BY ciudad;

La consulta anterior da como resultado la maxima temperatura baja por ciudad.

SELECT ciudad, max(baja_temp) FROM tiempo GROUP BY ciudad HAVING max(baja_temp) < 40;

La consulta anterior da como resultado la maxima temperatura por ciudad siempre y cuando el valor de la maxima temperatura baja sea menor a 40

SELECT ciudad, max(baja_temp) FROM tiempo WHERE ciudad LIKE ‘S%’ GROUP BY ciudad HAVING max(baja_temp) < 40;

La consulta anterior da como resultado la maxima temperatura por ciudad siempre y cuando el valor de la maxima temperatura baja sea menor a 40 y el nombre de la ciudad empieze por la letra S.

Nota: La informacion de este post es tomada de la documentacion oficial de PostgreSQL.

septiembre 12, 2007

Tips MySQL

Filed under: ./base\ de\ datos — elblogdeover @ 5:46 am

1. Crear una cuenta de usuario en la base de datos
mysql> GRANT ALL ON basededatos.* TO ‘user’@’hosts’ IDENTIFIED BY ‘pass’;

2. Cancelar parcialmente la creacion de una consulta

mysql> SELECT *
-> FROM basededatos
-> WHERE\c

mysql>

“\c” mata la creacion del procedimiento SQL.

3. Con la sentencia SOURCE, se puede cargar un archivo para ingresar en una consulta desde la consola de mysql.

Crea un blog o un sitio web gratuitos con WordPress.com.