Está en la página 1de 86

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD I INTRODUCCIN AL SISTEMA MANEJADOR DE BASES DE DATOS

ARR, MMCH

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 1

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

1.1

Conceptos.

Bases de Datos. Una base de datos en un conjunto de informacin interrelacionada con un objetivo especfico.

Sistema Manejador de Bases de Datos. Es un conjunto de datos y los programas de aplicacin que accesan a dichos datos con la finalidad de almacenar, manipular y consultar dicha informacin en un momento determinado, de una manera rpida y eficiente.

El Sistema Manejador de Bases de Datos consta de: Lenguaje de definicin de datos [DDL: Data Definition Language]. Es utilizado para describir todas las estructuras de informacin y los programas que se usan para construir, actualizar e introducir la informacin que contiene una base de datos. Ejemplo: Describir y dar nombre a los datos que se requieren para cada aplicacin, junto a las reglas que garantizan su integridad y seguridad.

Lenguaje de manipulacin de datos [DML: Data Manipulation Language]. es utilizado para escribir programas que crean, actualizan y extraen informacin de las bases de datos. Ejemplo: Consultar, aadir, modificar o borrar datos de la base de datos.

Lenguaje de Consulta Estructurada. [SQL: Structured Query Language]. El lenguaje de consulta permite al usuario hacer requisiciones de datos sin tener que escribir un programa, usando instrucciones como el SELECT, el PROJECT y el JOIN.

Un Sistema Manejador de Bases de Datos debe permitir definir estructuras de almacenamiento, acceder a los datos de forma eficiente y segura, definir usuarios, etc.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 2

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Ejemplos de Sistema Manejadores de Bases de Datos: Access, Oracle, MySQL, Fox Pro, SQL Server, PostgreSQL.

Arquitectura de un Sistema Manejador de Bases de Datos

1.2

Caracterstica de un Sistema Manejador de Bases de Datos.


Un SMBD debe proporcionar a los usuarios la capacidad de almacenar datos en la base de datos, acceder a ellos y actualizarlos. Esta es la funcin fundamental de un SGBD.

Un SMBD debe proporcionar un catlogo en el que se almacenan las descripciones de los datos y que sea accesible por los usuarios. Este catlogo es lo que se denomina diccionario de datos y contiene informacin que describe los datos de la base de datos (meta datos).

Un SMBD debe proporcionar un mecanismo que garantice que todas las actualizaciones correspondientes a una determinada transaccin se realicen, o que no se realice ninguna. Una transaccin es un conjunto de acciones que cambian el contenido de la BD.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 3

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Un SMBD debe proporcionar un mecanismo que asegure que la base de datos se actualice correctamente cuando varios usuarios la estn actualizando

concurrentemente. Uno de los principales objetivos de los SGBD es el permitir que varios usuarios tengan acceso concurrente a los datos que comparten. El SGBD se debe encargar de que estas interferencias no se produzcan en el acceso simultneo.

Un SMBD debe proporcionar un mecanismo capaz de recuperar la base de datos en caso de que ocurra algn suceso que la dae llevndola a un estado consistente.

Un SMBD debe proporcionar un mecanismo que garantice que slo los usuarios autorizados pueden acceder a la base de datos. La proteccin debe ser contra accesos no autorizados, tanto intencionados como accidentales.

Un SMBD debe proporcionar los medios necesarios para garantizar que tanto los datos de la base de datos, como los cambios que se realizan sobre estos datos, sigan ciertas reglas. La integridad de la base de datos requiere la validez y consistencia de los datos almacenados. Se puede considerar como otro modo de proteger la base de datos, pero adems de tener que ver con la seguridad, tiene otras implicaciones. La integridad se ocupa de la calidad de los datos. Normalmente se expresa mediante restricciones, que son una serie de reglas que la base de datos no puede violar.

Un SGBD debe proporcionar una serie de herramientas que permitan administrar la base de datos de modo efectivo. Dichas herramientas deben proporcionar: Herramienta de administracin de usuarios Analizador de logs (Registro oficial de eventos durante un periodo de tiempo en particular. Para los profesionales en seguridad informtica un log es usado para registrar datos o informacin sobre quin, que, cuando, donde y por qu, un evento ocurre para un dispositivo en particular o aplicacin. Administrador de procesos Herramientas para importar y exportar datos.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 4

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Herramientas para monitorizar el uso y el funcionamiento de la base de datos. Programas de anlisis estadstico para examinar las prestaciones o las estadsticas de utilizacin. Herramientas para reorganizacin de ndices.

Actividades de la Unidad.

Presentacin por equipos de diferentes manejadores de bases de datos (Microsft Visual FoxPro, Oracle, Access, MySQL, SQL Server, PostgreSQL, etc) Realizar un anlisis comparativo de las caractersticas principales de los Manejadores de Bases de Datos. Instalacin del Sistema Manejador de Bases de Datos MySQL (Paquete XAMPP o WAMPP).

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 5

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD II LENGUAJE DE DEFINICIN DE DATOS (DDL)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 6

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Un Lenguaje de Definicin de Datos (Data Definition Language, DDL por sus siglas en ingls) es un lenguaje proporcionado por el sistema de gestin de base de datos que permite a los usuarios de la misma llevar a cabo las tareas de definicin de las estructuras que almacenarn los datos as como de los procedimientos o funciones que permitan consultarlos. Un Data Definition Language o Lenguaje de descripcin de datos (DDL) es un lenguaje de programacin para definir estructuras de datos.

El DDL trmino fue introducido por primera vez en relacin con el Codasyl modelo de base de datos, donde el esquema de la base de datos ha sido escrito en un lenguaje de descripcin de datos que describen los registros, los campos, y "conjuntos" que conforman el usuario modelo de datos.

2.1 Creacin de Bases de Datos.


La creacin de la base de datos consiste en la creacin de las tablas que la componen. En realidad, antes de poder proceder a la creacin de las tablas, normalmente hay que crear la base de datos, lo que a menudo significa definir un espacio de nombres separado para cada conjunto de tablas. De esta manera, para una DBMS se pueden gestionar diferentes bases de datos independientes al mismo tiempo sin que se den conflictos con los nombres que se usan en cada una de ellas. Cada DBMS prev un procedimiento propietario para crear una base de datos. Normalmente, se ampla el lenguaje SQL introduciendo una instruccin: "CREATE DATABASE".

CREATE DATABASE nombre_de_la_base_de_datos;

Ejemplo: Crear la base de Datos prueba

mysql> CREATE DATABASE prueba;

Para mostrar la base de datos ya creada, se utiliza la sentencia Show Databases;

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 7

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Ejemplo: mysql> SHOW DATABASES;


+--------------------+ | Database | +--------------------+ | mysql | | prueba | | test | +--------------------+ 3 rows in set (0.00 sec)

Aqu se muestra las bases de datos ya creadas, y entre ellas la base de datos recin creada, prueba.

Para seleccionar una base de datos se usa el comando USE, que no es exactamente una sentencia SQL, sino ms bien de una opcin de MySQL.

USE nombre_de_la_BD;

Ejemplo: Usar la base de datos prueba


mysql> USE prueba; Database changed

2.2 Creacin de Tablas


Una vez creada la base de datos, se pueden crear las tablas que la componen. La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y tenemos muchas posibilidades diferentes al momento de crear una tabla. Debemos indicar el nombre de la tabla y los nombres y tipos de las columnas. La instruccin SQL propuesta para este fin es CREATE Table.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 8

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

CREATE TABLE nombre_tabla ( nombre_columna tipo_columna [ clusula_defecto ] [ vnculos_de_columna ] [ , nombre_columna tipo_columna [ clusula_defecto ] [ vnculos_de_columna ] ... ] [ , [ vnculo_de tabla] ... ] ) nombre_columna: es el nombre de la columna que compone la tabla. Los nombres tienen que comenzar con un carcter alfabtico. tipo_columna: es la indicacin del tipo de dato que la columna podr contener. Los principales tipos previstos por el estndar SQL son:
CHARACTER(n) Una cadena de longitud fija con exactamente n caracteres. CHARACTER se puede abreviar con CHAR. CHARACTER VARYING(n) Una cadena de longitud variable con un mximo de n caracteres. CHARACTER VARYING se puede abreviar con VARCHAR o CHAR VARYING. INTEGER Un nmero estero con signo. Se puede abreviar con INT. La precisin, es decir el tamao del nmero entero que se puede memorizar en una columna de este tipo, depende de la implementacin de la DBMS en cuestin. SMALLINT Un nmero entero con signo y una precisin que no sea superior a INTEGER. FLOAT(p) Un nmero con coma mvil y una precisin p. El valor mximo de p depende de la implementacin de la DBMS. Se puede usar FLOAT sin indicar la precisin, empleando, por tanto, la precisin por defecto, tambin sta dependiente de la implementacin. REAL y DOUBLE PRECISION son sinnimo para un FLOAT con precisin concreta. Tambin en este caso, las precisiones dependen de la implementacin, siempre que la precisin del primero no sea superior a la del segundo. DECIMAL(p,q) Un nmero con coma fija de por lo menos p cifras y signo, con q cifras despus de la coma. DEC es la abreviatura de DECIMAL. DECIMAL(p) es una abreviatura de DECIMAL(p,0). El valor mximo de p depende de la implementacin. INTERVAL Un periodo de tiempo (aos, meses, das, horas, minutos, segundos y fracciones de segundo). DATE, TIME y TIMESTAMP Un instante temporal preciso. DATE permite indicar el ao, el mes y el da. Con TIME se pueden especificar la hora, los minutos y los segundos. TIMESTAMP es la combinacin de los dos anteriores. Los segundos son un nmero con coma, lo que permite especificar tambin fracciones de segundo.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 9

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

La sintaxis para definir columnas es:

nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia]

Valores nulos: Al definir cada columna se puede decidir si podr o no contener valores nulos. La opcin por defecto es que se permitan valores nulos, NULL, y para que no se permitan, se usa NOT NULL. Por ejemplo:
mysql> CREATE TABLE ciudad1(nombre CHAR(20) NOT NULL, poblacion INT NULL); Query OK, 0 rows affected (0.98 sec)

Valores por defecto: Para cada columna tambin se puede definir, opcionalmente, un valor por defecto. El valor por defecto se asignar de forma automtica a una columna cuando no se especifique un valor determinado al aadir filas. Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usar NULL como valor por defecto. En el ejemplo anterior, el valor por defecto para poblacion es NULL.

Por ejemplo, si se quiere que el valor por defecto para poblacin sea 5000, podemos crear la tabla como:
mysql> CREATE TABLE ciudad2(nombre CHAR(20) NOT NULL, poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.09 sec)

Claves primaria: Tambin se puede definir una clave primaria sobre una columna, usando la palabra clave KEY o PRIMARY KEY.

Slo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave primaria no puede tener valores NULL. Si esto no se especifica de forma explcita, MySQL lo har de forma automtica.

Por ejemplo, si queremos crear un ndice en la columna nombre de la tabla de ciudades, se crear la tabla as:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 10

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

mysql> CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY, poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.20 sec)

mysql> CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL, poblacion INT NULL DEFAULT 5000, PRIMARY KEY(nombre)); Query OK, 0 rows affected (0.20 sec)

Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY.

Columnas autoincrementadas: En MySQL tenemos la posibilidad de crear una columna autoincrementada, aunque esta columna slo puede ser de tipo entero.

Si al insertar una fila se omite el valor de la columna autoincrementada o si se inserta un valor nulo para esa columna, su valor se calcula automticamente, tomando el valor ms alto de esa columna y sumndole una unidad. Esto permite crear, de una forma sencilla, una columna con un valor nico para cada fila de la tabla. Generalmente, estas columnas se usan como claves primarias 'artificiales'. MySQL est optimizado para usar valores enteros como claves primarias, de modo que la combinacin de clave primaria, que sea entera y autoincrementada es ideal para usarla como clave primaria artificial:
mysql> CREATE TABLE ciudad5 (clave INT AUTO_INCREMENT PRIMARY KEY, nombre CHAR(20) NOT NULL,poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.11 sec)

Comentario: Adicionalmente, al crear la tabla, podemos aadir un comentario a cada columna. Este comentario sirve como informacin adicional sobre alguna caracterstica especial de la columna, y entra en el apartado de documentacin de la base de datos:
mysql> CREATE TABLE ciudad6(clave INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Clave principal', nombre CHAR(50) NOT NULL, poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.08 sec)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 11

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Para mostrar la estructura de la tabla .


mysql> show full columns from nombre_tabla;

Adems de los comandos: CREATE DATABASE, USE, CREATE TABLE, SHOW DATABASE y SHOW TABLES, tambin son DLLs: ALTER TABLE y DROP.

ALTER TABLE Alter table clientes change apaterno apaterno varchar(50); Alter table clientes rename tabla_clie; Cambia el tipo de dato o nombre de la columna apaterno a varchar(50). Cambia el nombre de la tabla clientes por tabla_clie. Elimina la columna domicilio de la tabla tabla_clie. Aade la columna nombre de tipo varchar(30) a la tabla tabla_clie.

Alter tabla tabla_clie drop domicilio;

Alter table tabla_clie add nombre varchar(30);

Alter table tabla_clie add index (apaterno); Alter table tabla_clie add primary key (id_clientes);

Pone como columna indexada apaterno de la tabla tabla_clie. Hace de la columna id_clientes de la tabla tabla_clie, la llave primaria.

DROP Drop table gente; Drop database NombreBd; Drop index apaterno on tabla_clie Elimina la tabla gente. Elimina toda la base de datos. Le quita la indexacin a la columna apaterno de la tabla tabla_clie. Alter table table_clie drop Primary Key Borra una clave primaria (en una tabla solo existe una llave primaria por eso no se pone el nombre de la columna).

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 12

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

2.2.1 Integridad.
Integridad referencial. Una clave secundaria (externa o fornea) en una base de datos relacional enlaza cada fila de la tabla hijo que contiene la clave fornea con la fila de la tabla padre que contiene el valor de clave primaria correspondiente. El DBMS puede ser preparado para forzar esta restriccin de clave fornea/clave primaria. Las restricciones de integridad referencial aseguran que las relaciones entre entidades en la base de datos se preserven durante las actualizaciones. En particular, la integridad referencial debe incluir reglas que indiquen cmo manejar la supresin de filas que son referenciadas mediante otras filas.

2.2.2 Integridad Referencial Declarativa.


Existen cuatro tipos de actualizaciones de bases de datos que pueden corromper la integridad referencial de las relaciones padre/hijo de una base de datos. 1. La insercin de una nueva fila hijo. Cuando se inserta una nueva fila en la tabla hijo, su valor de clave fornea debe coincidir con uno de los valores de clave primaria en la tabla padre. Si el valor de clave fornea no coincide con ninguna clave primaria, la insercin de la fila corromper la base de datos, ya que habr un hijo sin un padre (un hurfano). Observe que insertar una fila en la tabla padre nunca representa un problema; simplemente se convierte en un padre sin hijos. 2. La actualizacin de la clave fornea en una fila hijo. Esta es una forma diferente del problema anterior. Si la clave fornea se modifica mediante una sentencia UPDATE, el nuevo valor deber coincidir con un valor de clave primaria en la tabla padre. En caso contrario la fila actualizada ser hurfana.

3. La supresin de una fila padre. Si una fila de la tabla padre, que tiene uno o ms hijos se suprime, las filas hijo quedarn hurfanas. Los valores de clave fornea en estas filas ya no se correspondern con ningn valor de clave primaria en la tabla padre. Observe que suprimir una fila de la tabla hijo nunca representa un problema; el padre de esta fila simplemente tendr un hijo menos despus de la supresin.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 13

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

4. La actualizacin de la clave primaria en una fila padre: Esta es una forma diferente del problema anterior. Si la clave primaria de una fila en la tabla padre se modifica, todos los hijos actuales de esa fila quedarn hurfanos, puesto que sus claves forneas ya no corresponden con ningn valor de clave primaria. Claves forneas en MySQL

Estrictamente hablando, para que un campo sea una clave fornea, ste necesita ser definido como tal al momento de crear una tabla. Se pueden definir claves forneas en cualquier tipo de tabla de MySQL, pero nicamente tienen sentido cuando se usan tablas del tipo InnoDB. Para trabajar con claves forneas, necesitamos hacer lo siguiente:

1. Crear ambas tablas del tipo InnoDB. 2. Usar la sintaxis FOREIGN KEY(campo_fk) REFERENCES nombre_tabla

(nombre_campo) 3. Crear un ndice en el campo que ha sido declarado clave fornea.

InnoDB no crea de manera automtica ndices en las claves forneas o en las claves referenciadas, as que debemos crearlos de manera explcita. Los ndices son necesarios para que la verificacin de las claves forneas sea ms rpida. A continuacin se muestra como definir las dos tablas de ejemplo.
CREATE TABLE cliente(id_cliente INT NOT NULL, nombre VARCHAR(20), apaterno VARCHAR(20), amaterno VARCHAR(20), rfc VARCHAR(13), PRIMARY KEY (id_cliente)) TYPE = INNODB;

CREATE TABLE vendedor(id_vendedor INT NOT NULL, nombre VARCHAR(35), depto VARCHAR (10), fecha DATE, PRIMARY KEY(id_vendedor)) TYPE = INNODB;

Se crea la tabla venta y se crea el campo id_cliente como llave fornea, haciendo referencia o relacionndolo con el campo id_cliente de la tabla cliente.
CREATE TABLE venta(id_factura INT NOT NULL, id_cliente INT NOT NULL, cantidad INT, vendedor int NOT null, comentarios text, PRIMARY KEY(id_factura), FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)) TYPE = INNODB;

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 14

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

La sintaxis completa de una restriccin de clave fornea es la siguiente: [CONSTRAINT smbolo] FOREIGN KEY (nombre_columna, ...) REFERENCES nombre_tabla (nombre_columna, ...) [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}] [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

Las columnas correspondientes en la clave fornea y en la clave referenciada deben tener tipos de datos similares para que puedan ser comparadas sin la necesidad de hacer una conversin de tipos. El tamao y el signo de los tipos enteros debe ser el mismo. En las columnas de tipo caracter, el tamao no tiene que ser el mismo necesariamente. Por ejemplo, la creacin de la clave fornea en la tabla venta que se mostr anteriormente pudo haberse hecho de otra manera con el uso de una sentencia ALTER TABLE. Vamos a agregar otra llave fornea en la tabla venta a travs del campo vendedor, haciendo referencia o relacionndolo con el campo id_vendedor de la tabla vendedor.
ALTER TABLE venta ADD FOREIGN KEY(vendedor) REFERENCES vendedor(id_vendedor) TYPE = INNODB;

Esto es lo que acabamos de crear.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 15

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

NOTA: Verificar la versin del MySQL, ya que dependiendo de la versin se crean automticamente las tablas de tipo InnoDB, TYPE=INNODB, y no es necesario agregar el

La integridad referencial se puede comprometer bsicamente en tres situaciones:

1.- Cuando se est insertando un nuevo registro, 2.- Cuando se est eliminando un registro, y 3.- Cuando se est actualizando un registro. La restriccin de clave fornea que hemos definido se asegura que cuando un nuevo registro sea creado en la tabla venta, ste debe tener su correspondiente registro en la tabla cliente.

Una vez que hemos creado las tablas, vamos a insertar algunos datos que nos sirvan para demostrar algunos conceptos importantes:
mysql>INSERT INTO cliente VALUES (1,'Juan','Hernndez','Martnez','HEMJ781024TTT'); Query OK, 1 row affected (0.05 sec) mysql>INSERT INTO cliente VALUES (2,'Jos','Prez','Morales','PEMJ761104RTY'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO vendedor VALUES (10,'Ana De la Rosa Manrquez','Abarrotes', '2003-09-20'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO vendedor VALUES (20,'Marcelo Enrquez Gmez','Deportes', '2000-10-23'); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO `venta` (`id_factura`, `id_cliente`, `cantidad`, `vendedor`, `comentarios`) VALUES ('100', '2', '3456', '20', 'primer venta del da'); Query OK, 1 row affected (0.03 sec)

En este momento no hay ningn problema, sin embargo, vamos a ver qu sucede cuando intentamos insertar un registro en la tabla venta que se refiera a un cliente no existente cuyo id_cliente es 67:
mysql> INSERT INTO venta VALUES ('200', '67', '3456', '20', 'primer venta del da'); ERROR 1216: Cannot add or update a child row: a foreign key constraint fails

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 16

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

El hecho es que MySQL no nos permite insertar este registro, ya que el cliente cuyo id_cliente es 67 no existe. La restriccin de clave fornea asegura que nuestros datos mantienen su integridad. Sin embargo, qu sucede cuando eliminamos algn registro? Vamos a agregar un nuevo cliente, y un nuevo registro en la tabla venta, posteriormente eliminaremos el registro de nuestro tercer cliente:
mysql> INSERT INTO cliente VALUES(3,'Martn', De la rosa,Cabrera, ROCM811127); Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO venta VALUES(2,3,39,10,venta de contado); Query OK, 1 row affected (0.05 sec)

mysql> DELETE FROM cliente WHERE id_cliente=3; ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails

Debido a nuestra restriccin de clave fornea, MySQL no permite que eliminemos el registro de cliente cuyo id_cliente es 3, ya que se hace referencia a ste en la tabla venta. De nuevo, se mantiene la integridad de nuestros datos. Sin embargo existe una forma en la que podramos hacer que la sentencia DELETE se ejecute de cualquier manera, y la veremos brevemente, pero primero necesitamos saber cmo eliminar (quitar) una clave fornea.

Eliminacin de una clave fornea

No podemos slo eliminar una restriccin de clave fornea como si fuera un ndice ordinario. Veamos que sucede cuando lo intentamos.
mysql> ALTER TABLE venta DROP FOREIGN KEY; ERROR 1005: Can't create table '.test#sql-228_4.frm' (errno: 150)

Para eliminar la clave fornea se tiene que especificar el ID que ha sido generado y asignado internamente por MySQL a la clave fornea. En este caso, se puede usar la sentencia SHOW CREATE TABLE para determinar dicho ID.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 17

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

mysql> show create table venta;

-------------------------+ | Table | Create Table

-------------------------+ | venta | CREATE TABLE `venta` ( `id_factura` int(11) NOT NULL, `id_cliente` int(11) NOT NULL, `cantidad` int(11) DEFAULT NULL, `vendedor` int(11) NOT NULL, `comentarios` text, PRIMARY KEY (`id_factura`), KEY `id_cliente` (`id_cliente`), KEY `vendedor` (`vendedor`), CONSTRAINT `venta_ibfk_2` FOREIGN KEY (`vendedor`) REFERENCES `vendedor` (`id_ vendedor`), CONSTRAINT `venta_ibfk_1` FOREIGN KEY (`id_cliente`) REFERENCES `cliente` (`id _cliente`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | -------------------------+ 1 row in set (0.00 sec)

En nuestro ejemplo, la restriccin tiene el ID `venta_ibfk_1` y `venta_ibfk_1`(es muy probable que este valor sea diferente en cada caso); el primero que relaciona a venta con cliente y el segundo que relaciona a venta con vendedor. Borremos la llave fornea que relaciona a venta con cliente con el ID `venta_ibfk_1`.
mysql> ALTER TABLE venta DROP FOREIGN KEY venta_ibfk_1; Query OK, 3 rows affected (0.23 sec) Records: 3 Duplicates: 0 Warnings: 0

Eliminacin de registros con claves forneas

Una de las principales bondades de las claves forneas es que permiten eliminar y actualizar registros en cascada.
ARR, MMHC INGENIERA EN SISTEMAS COMPUTACIONALES Pgina 18

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Con las restricciones de clave fornea podemos eliminar un registro de la tabla cliente y a la vez eliminar un registro de la tabla venta usando slo una sentencia DELETE. Esto es llamado eliminacin en cascada, en donde todos los registros relacionados son eliminados de acuerdo a las relaciones de clave fornea. Una alternativa es no eliminar los registros relacionados, y poner el valor de la clave fornea a NULL (asumiendo que el campo puede tener un valor nulo). En nuestro caso, no podemos poner el valor de nuestra clave fornea id_cliente en la tabla venta, ya que se ha definido como NOT NULL. Las opciones estndar cuando se elimina un registro con clave fornea son:

ON DELETE RESTRICT ON DELETE NO ACTION ON DELETE SET DEFAULT ON DELETE CASCADE ON DELETE SET NULL

ON DELETE RESTRICT es la accin predeterminada, y no permite una eliminacin si existe un registro asociado, como se mostr en el ejemplo anterior. ON DELETE NO ACTION hace lo mismo.

ON DELETE SET DEFAULT actualmente no funciona en MySQL - se supone que pone el valor de la clave fornea al valor por omisin (DEFAULT) que se defini al momento de crear la tabla.

Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es eliminada, entonces se eliminarn las filas de la tabla hijo cuya clave fornea sea igual al valor de la clave referenciada en la tabla padre. Esta accin siempre ha estado disponible en MySQL.

Si se especifica ON DELETE SET NULL, las filas en la tabla hijo son actualizadas automticamente poniendo en las columnas de la clave fornea el valor NULL. Si se especifica una accin SET NULL, debemos asegurarnos de no declarar las columnas en la tabla como NOT NULL.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 19

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Vamos a mostrar un ejemplo de eliminacin en cascada, agregando nuevamente la llave fornea que relaciona venta con cliente, pero esta vez con borrado en cascada:
mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)REFERENCES cliente(id_cliente) ON DELETE CASCADE; Query OK, 3 rows affected (0.23 sec)

Vamos a ver cmo estn nuestros registros antes de ejecutar la sentencia DELETE:

Tabla cliente

Tabla vendedor

Tabla venta

Ahora eliminaremos a Jos Prez de la base de datos:


mysql> DELETE FROM cliente WHERE id_cliente=2; Query OK, 1 row affected (0.05 sec)

Al revisar la tabla venta, ahora estar vaca puesto que la venta del cliente 2 ha sido eliminada.
ARR, MMHC INGENIERA EN SISTEMAS COMPUTACIONALES Pgina 20

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Con la eliminacin en cascada, se ha eliminado el registro de la tabla venta al que estaba relacionado con Jos Prez.

Actualizacin de registros con claves forneas

Estas opciones son muy similares cuando se ejecuta una sentencia UPDATE, en lugar de una sentencia DELETE. stas son:

ON UPDATE CASCADE ON UPDATE SET NULL ON UPDATE RESTRICT

Vamos a ver un ejemplo, pero antes que nada, tenemos que eliminar la restriccin de clave fornea (debemos usar el ID especfico de nuestra tabla).
mysql> ALTER TABLE venta DROP FOREIGN KEY 0_26; Query OK, 2 rows affected (0.22 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)REFERENCES cliente(id_cliente) ON DELETE RESTRICT ON UPDATE CASCADE; Query OK, 2 rows affected (0.22 sec) Records: 2 Duplicates: 0 Warnings: 0

NOTA: Se debe especificar ON DELETE antes de ON UPDATE, ya que de otra manera se recibir un error al definir la restriccin.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 21

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Ahora est lista la clave fornea para una actualizacin en cascada. Este es el ejemplo:
mysql> INSERT INTO `venta` (`id_factura`, `id_cliente`, `cantidad`, `vendedor`, `comentarios`) VALUES ('200', '1', '5000', '20', 'primer venta del da'); mysql> SHOW TABLE `venta`

mysql> UPDATE cliente SET id_cliente=10 WHERE id_cliente=1; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM venta;

En este caso, al actualizar el valor de id_cliente en la tabla cliente, se actualiza de manera automtica el valor de la clave fornea en la tabla venta. Esta es la actualizacin en cascada.

2.3 Creacin de ndices


Un ndice es una estructura interna que el sistema puede usar para encontrar uno o ms registros en una tabla de forma rpida. En efecto, un ndice de base de datos es, conceptualmente, similar a un ndice encontrado al final de cualquier libro de texto. De la misma forma que el lector de un libro acudira a un ndice para determinar en qu pginas se encuentra un determinado tema, un sistema de base de datos leer un ndice para determinar las posiciones de registros seleccionados por una consulta SQL. En otras palabras, la presencia de un ndice puede ayudar al sistema a procesar algunas consultas de un modo ms eficiente.

Un ndice de base de datos se crea para una columna o grupo de columnas. La figura siguiente muestra un ndice (XCNOMBRE) basado en la columna CNOMBRE de la tabla CURSO.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 22

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Observemos que el ndice, a diferencia de la tabla CURSO, representa valores CNOMBRE en orden. Adems, el ndice es pequeo en relacin con el tamao de la tabla. Por lo tanto, es, probablemente, ms fcil que el sistema busque el ndice para localizar un registro con un valor CNOMBRE dado, a que explore toda la tabla en busca de ese valor. Por ejemplo, el ndice XCNOMBRE podra ser muy til al sistema cuando ejecute la siguiente sentencia SELECT.

Ventajas de los ndices:

Acceso directo a un registro especificado Ordenacin

Desventajas:

Espacio de disco usado por el ndice Costos de actualizacin

Tenemos tres tipos de ndices.

1. El primero corresponde a las claves primarias, que como vimos, tambin se pueden crear en la parte de definicin de columnas. La sintaxis para definir claves primarias es: definicin_columnas | PRIMARY KEY (index_nombre_col,...)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 23

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

mysql> CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL, poblacion INT NULL DEFAULT 5000, PRIMARY KEY (nombre));

Pero esta forma tiene ms opciones, por ejemplo, entre los parntesis podemos especificar varios nombres de columnas, para construir claves primarias compuestas por varias columnas:
mysql> CREATE TABLE mitabla1 (id1 CHAR(2) NOT NULL, id2 CHAR(2) NOT NULL, texto CHAR(30),PRIMARY KEY (id1, id2));

2. El segundo tipo de ndice permite definir ndices sobre una columna, sobre varias, o sobre partes de columnas. Para definir estos ndices se usan indistintamente las opciones KEY o INDEX.
mysql> CREATE TABLE mitabla2(id INT, nombre CHAR(19), INDEX (nombre));

O su equivalente:
mysql> CREATE TABLE mitabla3(id INT, nombre CHAR(19), KEY (nombre));

Tambin podemos crear un ndice sobre parte de una columna:


mysql> CREATE TABLE mitabla4(id INT, nombre CHAR(19), INDEX (nombre(4)));

Este ejemplo usar slo los cuatro primeros caracteres de la columna 'nombre' para crear el ndice.

3. El tercero permite definir ndices con claves nicas, tambin sobre una columna, sobre varias o sobre partes de columnas. Para definir ndices con claves nicas se usa la opcin UNIQUE.

La diferencia entre un ndice nico y uno normal es que en los nicos no se permite la insercin de filas con claves repetidas. La excepcin es el valor NULL, que s se puede repetir.
mysql> CREATE TABLE mitabla5 (id INT, nombre CHAR(19), UNIQUE (nombre));

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 24

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Una clave primaria equivale a un ndice de clave nica, en la que el valor de la clave no puede tomar valores NULL. Tanto los ndices normales como los de claves nicas s pueden tomar valores NULL.

Por lo tanto, las definiciones siguientes son equivalentes:


mysql> CREATE TABLE mitabla6(id INT, nombre CHAR(19) NOT NULL, UNIQUE (nombre));

mysql> CREATE TABLE mitabla7(id INT, nombre CHAR(19), PRIMARY KEY (nombre));

Actividades de la Unidad.

Creacin de una base de datos con tres tablas. Aadir relaciones a la base de datos. Agregar llaves forneas a las tablas. Aplicar la integridad referencial a la base de datos. Indexar una tabla por un campo especfico.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 25

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD III LENGUAJES Y CONSULTAS DE MANIPULACIN DE DATOS (DML)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 26

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Lenguaje de Manipulacin de Datos. DML (Data Manipulation Language). Es el que se usa para modificar y obtener datos desde las bases de datos.

3.1 Instrucciones INSERT, UPDATE Y DELETE.


Insert

La forma ms directa de insertar una fila nueva en una tabla es mediante una sentencia INSERT. En la forma ms simple de esta sentencia debemos indicar la tabla a la que queremos aadir filas, y los valores de cada columna. Las columnas de tipo cadena o fechas deben estar entre comillas sencillas o dobles, para las columnas numricas esto no es imprescindible, aunque tambin pueden estar entrecomilladas. Para estos ejemplos, se utilizar la BD denominada Prueba, realizada en la unidad anterior;
mysql> INSERT INTO gente VALUES ('Fulano','1974-04-12'); Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO gente VALUES ('Mengano','1978-06-15'); Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO gente VALUES('Tulano','2000-12-02'),('Pegano','1993-02-10'); Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0

Si no se necesita asignar un valor concreto para alguna columna, se indica el valor por defecto indicado para esa columna cuando se cre la tabla, usando la palabra DEFAULT:
mysql> INSERT INTO ciudad2 VALUES ('Perillo', DEFAULT); Query OK, 1 row affected (0.03 sec)

Otra opcin consiste en indicar una lista de columnas para las que se van a suministrar valores.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 27

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

A las columnas que no se nombren en esa lista se les asigna el valor por defecto. Este sistema, adems, 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, 'Madrid'), (9000000, 'Pars'), (3500000, 'Berln'); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0

Existe otra sintaxis alternativa, que consiste en indicar el valor para cada columna:
mysql> INSERT INTO ciudad5 SET nombre='Roma', poblacion=8000000; Query OK, 1 row affected (0.05 sec)

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 opcin 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 poblacin en caso de repeticin:
mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES('Madrid', 7000000); Query OK, 1 rows affected (0.02 sec)

mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES ('Pars', 9000000), ('Madrid', 7200000) ON DUPLICATE KEY UPDATE poblacion=VALUES(poblacion); Query OK, 3 rows affected (0.06 sec) Records: 2 Duplicates: 1 Warnings: 0

En este ejemplo, la segunda vez que intentamos insertar la fila correspondiente a 'Madrid' se usar el nuevo valor de poblacin. Si en lugar de VALUES(poblacion) usamos poblacin el nuevo valor de poblacin se ignora. Tambin podemos usar cualquier expresin:
ARR, MMHC INGENIERA EN SISTEMAS COMPUTACIONALES Pgina 28

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES -> ('Pars', 9100000) -> ON DUPLICATE KEY UPDATE poblacion=poblacion; Query OK, 2 rows affected (0.02 sec)

Update

Podemos modificar valores de las filas de una tabla usando la sentencia UPDATE. En su forma ms simple, los cambios se aplican a todas las filas, y a las columnas que especifiquemos.

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]

Por ejemplo, podemos aumentar en un 10% la poblacin de todas las ciudades de la tabla ciudad3 usando esta sentencia:
mysql> UPDATE ciudad3 SET poblacion=poblacion*1.10; Query OK, 5 rows affected (0.15 sec) Rows matched: 5 Changed: 5 Warnings: 0

Podemos, del mismo modo, actualizar el valor de ms de una columna, separndolas en la seccin SET mediante comas:
mysql> UPDATE ciudad5 SET clave=clave+10, poblacion=poblacion*0.97; Query OK, 4 rows affected (0.05 sec) Rows matched: 4 Changed: 4 Warnings: 0

En este ejemplo hemos incrementado el valor de la columna 'clave' en 10 y disminuido el de la columna 'poblacion' en un 3%, para todas las filas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 29

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Pero no tenemos por qu actualizar todas las filas de la tabla. Podemos limitar el nmero de filas afectadas de varias formas. La primera es mediante la clusula WHERE. Usando esta clusula podemos establecer una condicin. Slo las filas que cumplan esa condicin sern actualizadas:
mysql> UPDATE ciudad5 SET poblacion=poblacion*1.03 WHERE nombre='Roma'; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0

En este caso slo hemos aumentado la poblacin de las ciudades cuyo nombre sea 'Roma'. Las condiciones pueden ser ms complejas. Existen muchas funciones y operadores que se pueden aplicar sobre cualquier tipo de columna, y tambin podemos usar operadores booleanos como AND u OR.

Otra forma de limitar el nmero de filas afectadas es usar la clusula LIMIT. Esta clusula permite especificar el nmero de filas a modificar:
mysql> UPDATE ciudad5 SET clave=clave-10 LIMIT 2; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

En este ejemplo hemos decrementado en 10 unidades la columna clave de las dos primeras filas. Esta clusula se puede combinar con WHERE, de modo que slo las 'n' primeras filas que cumplan una determinada condicin se modifiquen. Sin embargo esto no es lo habitual, ya que, si no existen claves primarias o nicas, el orden de las filas es arbitrario, no tiene sentido seleccionarlas usando slo la clusula LIMIT.

La clusula LIMIT se suele asociar a la clusula ORDER BY. Por ejemplo, si queremos modificar la fila con la fecha ms antigua de la tabla 'gente', usaremos esta sentencia:
mysql> UPDATE gente SET fecha="1985-04-12" ORDER BY fecha LIMIT 1; Query OK, 1 row affected, 1 warning (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 1

Si queremos modificar la fila con la fecha ms reciente, usaremos el orden inverso, es decir, el descendente:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 30

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

mysql> UPDATE gente SET fecha="2001-12-02" ORDER BY fecha DESC LIMIT 1; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0

Cuando exista una clave primaria o nica, se usar ese orden por defecto, si no se especifica una clusula ORDER BY. Delete

Para eliminar filas se usa la sentencia DELETE. La sintaxis es muy parecida a la de UPDATE.

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]

La forma ms simple es no usar ninguna de las clusulas opcionales:


mysql> DELETE FROM ciudad3; Query OK, 5 rows affected (0.05 sec)

De este modo se eliminan todas las filas de la tabla. Pero es ms frecuente que slo queramos eliminar ciertas filas que cumplan determinadas condiciones. La forma ms normal de hacer esto es usar la clusula WHERE.
mysql> DELETE FROM ciudad5 WHERE clave=2; Query OK, 1 row affected (0.05 sec)

Tambin podemos usar las clusulas LIMIT y ORDER BY del mismo modo que en la sentencia UPDATE, por ejemplo, para eliminar las dos ciudades con ms poblacin:
mysql> DELETE FROM ciudad5 ORDER BY poblacion DESC LIMIT 2; Query OK, 2 rows affected (0.03 sec)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 31

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

3.2 Consultas bsicas SELECT, WHERE y Funciones a nivel registro.


La sintaxis de SELECT es compleja. Una forma ms general consiste en la siguiente sintaxis:

SELECT [ALL | DISTINCT | DISTINCTROW] expresion_select,... FROM referencias_de_tablas WHERE condiciones [GROUP BY {nombre_col | expresion | posicion} [ASC | DESC], ... [WITH ROLLUP]] [HAVING condiciones] [ORDER BY {nombre_col | expresion | posicion} [ASC | DESC] ,...] [LIMIT {[desplazamiento,] contador | contador OFFSET desplazamiento}]

La forma ms sencilla es la que hemos usado hasta ahora, consiste en pedir todas las columnas y no especificar condiciones.
mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec)

Mediante la sentencia SELECT es posible hacer una proyeccin de una tabla, seleccionando las columnas de las que queremos obtener datos. En la sintaxis que hemos mostrado, la seleccin de columnas corresponde con la parte "expresion_select". En el ejemplo anterior hemos usado '*', que quiere decir que se muestran todas las columnas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 32

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Pero podemos usar una lista de columnas, y de ese modo slo se mostrarn esas columnas especificadas.
mysql> SELECT nombre FROM gente;

mysql> SELECT clave,poblacion FROM ciudad5; Empty set (0.00 sec)

Tambin podemos aplicar funciones sobre columnas de tablas, y usar esas columnas en expresiones para generar nuevas columnas:
mysql> SELECT nombre, fecha, DATEDIFF(CURRENT_DATE(),fecha)/365 FROM gente;

+---------+------------+------------------------------------+ | nombre | fecha | DATEDIFF(CURRENT_DATE(),fecha)/365 | +---------+------------+------------------------------------+ | Fulano | 1985-04-12 | 19.91 | | Mengano | 1978-06-15 | 26.74 | | Tulano | 2001-12-02 | 3.26 | | Pegano | 1993-02-10 | 12.07 | +---------+------------+------------------------------------+ 4 rows in set (0.00 sec)

Aprovechemos la ocasin para mencionar que tambin es posible asignar un alias a cualquiera de las expresiones select. Esto se puede hacer usando la palabra AS, aunque esta palabra es opcional:
mysql> SELECT nombre, fecha, DATEDIFF(CURRENT_DATE(),fecha)/365 AS edad -> FROM gente; +---------+------------+-------+ | nombre | fecha | edad | +---------+------------+-------+ | Fulano | 1985-04-12 | 19.91 | | Mengano | 1978-06-15 | 26.74 | | Tulano | 2001-12-02 | 3.26 | | Pegano | 1993-02-10 | 12.07 | +---------+------------+-------+ 4 rows in set (0.00 sec)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 33

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Podemos hacer:
mysql> SELECT 2+3 "2+3"; +-----+ | 2+3 | +-----+ |5|

mysql> INSERT INTO gente VALUES ('Pimplano', '1978-06-15'), -> ('Frutano', '1985-04-12'); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT fecha FROM gente; +------------+ | fecha | +------------+ | 1985-04-12 | | 1978-06-15 | | 2001-12-02 | | 1993-02-10 | | 1978-06-15 | | 1985-04-12 | +------------+ 6 rows in set (0.00 sec

Vemos que existen dos valores de filas repetidos, para la fecha "1985-04-12" y para "1978-06-15". La sentencia que hemos usado asume el valor por defecto (ALL) para el grupo de opciones ALL, DISTINCT y DISTINCTROW. En realidad slo existen dos opciones, ya que las dos ltimas: DISTINCT y DISTINCTROW son sinnimos.

La otra alternativa es usar DISTINCT, que har que slo se muestren las filas diferentes:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 34

INSTITUTO TECNOLGICO DE TUXTEPEC


mysql> SELECT DISTINCT fecha FROM gente; +------------+ | fecha | +------------+ | 1985-04-12 | | 1978-06-15 | | 2001-12-02 | | 1993-02-10 | +------------+ 4 rows in set (0.00 sec)

TALLER DE BASES DE DATOS

Otra de las operaciones del lgebra relacional era la seleccin, que consista en seleccionar filas de una relacin que cumplieran determinadas condiciones.

Lo que es ms til de una base de datos es la posibilidad de hacer consultas en funcin de ciertas condiciones. Generalmente nos interesar saber qu filas se ajustan a determinados parmetros. Por supuesto, SELECT permite usar condiciones como parte de su sintaxis, es decir, para hacer selecciones. Concretamente mediante la clusula WHERE, veamos algunos ejemplos:
mysql> SELECT FROM gente WHERE nombre="Mengano";* +---------+------------+ | nombre | fecha | +---------+------------+ | Mengano | 1978-06-15 | +---------+------------+ 1 row in set (0.03 sec)

mysql> SELECT * FROM gente WHERE fecha>="1986-01-01"; +--------+------------+ | nombre | fecha | +--------+------------+ | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | +--------+------------+ 2 rows in set (0.00 sec)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 35

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

mysql> SELECT * FROM gente WHERE fecha>="1986-01-01" AND fecha < "2000-01-01"; +--------+------------+ | nombre | fecha | +--------+------------+ | Pegano | 1993-02-10 | +--------+------------+ 1 row in set (0.00 sec)

3.3 Consultas sobre mltiples tablas.


Hasta ahora todas las consultas que hemos usado se refieren slo a una tabla, pero tambin es posible hacer consultas usando varias tablas en la misma sentencia SELECT. Esto nos permite realizar otras dos operaciones de lgebra relacional: el producto cartesiano y la composicin. La UNION de tablas se utiliza cuando tenemos dos tablas con las mismas columnas y queremos obtener una nueva tabla con las filas de la primera y las filas de la segunda. En este caso la tabla resultante tiene las mismas columnas que la primera tabla (que son las mismas que las de la segunda tabla).

Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y queremos una lista con todos los libros que tenemos. En este caso las dos tablas tienen las mismas columnas, lo nico que vara son las filas, adems queremos obtener una lista de libros (las columnas de una de las tablas) con las filas que estn tanto en libros nuevos como las que estn en libros antiguos, en este caso utilizaremos este tipo de operacin. Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de datos o tablas lgicas (resultados de una consulta), esto nos permite utilizar la operacin con ms frecuencia ya que pocas veces tenemos en una base de datos tablas idnticas en cuanto a columnas. El resultado es siempre una tabla lgica.

Por ejemplo queremos en un slo listado los productos cuyas existencias sean iguales a cero y tambin los productos que aparecen en pedidos del ao 90.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 36

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

En este caso tenemos unos productos en la tabla de productos y los otros en la tabla de pedidos, las tablas no tienen las mismas columnas no se puede hacer una union de ellas pero lo que interesa realmente es el identificador del producto (idfab,idproducto), luego por una parte sacamos los cdigos de los productos con existencias cero (con una consulta), por otra parte los cdigos de los productos que aparecen en pedidos del ao 90 (con otra consulta), y luego unimos estas dos tablas lgicas. El operador que permite realizar esta operacin es el operador UNION

La COMPOSICIN DE TABLAS consiste en concatenar filas de una tabla con filas de otra. En este caso obtenemos una tabla con las columnas de la primera tabla unidas a las columnas de la segunda tabla, y las filas de la tabla resultante son concatenaciones de filas de la primera tabla con filas de la segunda tabla.

El ejemplo anterior quedara de la siguiente forma con la composicin:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 37

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

A diferencia de la unin la composicin permite obtener una fila con datos de las dos tablas, esto es muy til cuando queremos visualizar filas cuyos datos se encuentran en dos tablas.

Por ejemplo queremos listar los pedidos con el nombre del representante que ha hecho el pedido, pues los datos del pedido los tenemos en la tabla de pedidos pero el nombre del representante est en la tabla de empleados y adems queremos que aparezcan en la misma lnea; en este caso necesitamos componer las dos tablas (Nota: en el ejemplo expuesto a continuacin, hemos seleccionado las filas que nos interesan).

Existen distintos tipos de composicin, aprenderemos a utilizarlos todos y a elegir el tipo ms apropiado a cada caso. Los tipos de composicin de tablas son:

El producto cartesiano El INNER JOIN El LEFT / RIGHT JOIN

3.3.1 Subconsultas.
Una subconsulta es una consulta dentro de otra. El SGBD usa los resultados de la subconsulta para determinar los resultados de la consulta de alto nivel que contiene a la subconsulta. En las formas ms simples de una subconsulta, esta aparece dentro de una clausula WHERE o HAVING de otra instruccin SQL.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 38

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Las subconsultas proporcionan una forma natural y eficiente de manejar las solicitudes de consultas que se expresan en trminos de los resultados de otras.

La subconsulta se encierra entre parntesis; sin embargo tiene la forma familiar de una instruccin SELECT, con una clausula FROM y clausulas opcionales WHERE, GROUP BY y HAVING . Ejemplo: Listar todos los clientes a los que sirve Antonio Viguer

La subconsulta utiliza dos tablas: clientes y empleado, las cuales estn relacionadas a travs de campo repclie (clientes) y del campo numemp (empleado).

TABLA CLIENTES

TABLA EMPLEADOS

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 39

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

SELECT nombre FROM clientes WHERE RepClie = (SELECT numemp FROM empleado where nombre ='Antonio Viguer')

Como se puede observar, despus de la clusula WHERE se condiciona el campo RepClie (representante del cliente), el cual no se conoce, slo contamos con el nombre Antonio Viguer, el cual se encuentra dentro de la tabla clientes, por lo tanto se crea una subconsulta en la cual el campo que se desplegar ser el campo numemp, que nos servir para utilizarlo en la consulta inicial.

Ya en la subconsulta (dentro del parntesis), se puede tener acceso al campo nombre, el cual forma parte de la tabla empleados. Pertenencias a conjuntos (IN)

El test de pertenencia a conjuntos (IN) en subconsultas es una forma modificada del test de pertenencia a conjuntos simples. Compara un nico valor de datos con una columna de valores de datos producidos por una subconsulta y devuelve un resultado TRUE si el valor de los datos coincide con uno de los valores de la columna. Este test se usa cuando es necesario comparar un valor de la fila que se est comprobando con un conjunto de valores producido por una subconsulta.

Ejemplo: Listar todos los representantes que trabajan en oficinas que estn por encima de sus objetivos

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 40

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Tabla empleado

Tabla oficina

SELECT nombre FROM empleado WHERE oficina IN (SELECT oficina FROM oficina WHERE ventas > objetivo)

Cabe hacer notar que en la sentencia IN, la subconsulta del parntesis puede arrojar un rango de valores y no slo un valor con en las subconsultas anteriores.

3.3.1 Operadores JOIN


Un JOIN de dos tablas es una combinacin entre las mismas basada en la coincidencia exacta(u otro tipo de comparacin) de dos columnas, una de cada tabla. El JOIN forma parejas de filas haciendo coincidir los contenidos de las columnas relacionadas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 41

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Se denomina composiciones internas porque en la salida no aparece ninguna tupla que no est presente en el producto cartesiano, es decir, la composicin se hace en el interior del producto cartesiano de las tablas. Las composiciones internas usan estas sintaxis:

referencia_tabla, referencia_tabla referencia_tabla [INNER | CROSS] JOIN referencia_tabla [condicin]

La condicin puede ser:

ON expresin_condicional | USING (lista_columnas)

La coma y JOIN son equivalentes, y las palabras INNER y CROSS son opcionales. La condicin en la clusula ON puede ser cualquier expresin vlida para una clusula WHERE, de hecho, en la mayora de los casos, son equivalentes. La clusula USING nos permite usar una lista de atributos que deben ser iguales en las dos tablas a componer. Ejemplo con el JOIN

Tabla empleado

Tabla oficina

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 42

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

SELECT * FROM empleado JOIN oficina ON empleado.oficina = oficina.oficina

Con esta sentencia los empleados que no tienen una oficina asignada (un valor nulo en el campo oficina de la tabla empleados) no aparecen en el resultado ya que la condicin empleado.oficina = oficina.oficina ser siempre nula para esos empleados.

En los casos en que no se quiera que

aparezcan las filas que no tienen una fila

coincidente en la otra tabla, utilizaremos el LEFT o RIGHT JOIN.

Haremos la misma consulta con LEFT y RIGHT JOIN para notar la diferencia entre ambas sentencias.
SELECT * FROM empleado LEFT JOIN oficina ON empleado.oficina = oficina.oficina

SELECT * FROM empleado RIGHT JOIN oficina ON empleado.oficina = oficina.oficina

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 43

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Como nos podemos dar cuenta dependiendo del orden en que coloquemos las tablas en la consulta, aparecern todos los registros de la tabla que nos interese aparezcan (ya sea izquierda o derecha, es decir, la primera o segunda tabla en la consulta, en ese orden), y si el campo coincidente con la otra tabla no tiene un valor, se deja indicado como NULL.

3.4 Agregacin GROUP BY, HAVING.


Group by

Permite combinar en un nico registro los registros con valores idnticos en la lista de campos especificada. Es posible agrupar filas en la salida de una sentencia SELECT segn los distintos valores de una columna, usando la clusula GROUP BY. Esto, en principio, puede parecer redundante, ya que podamos hacer lo mismo usando la opcin DISTINCT. Sin embargo, la clusula GROUP BY es ms potente.

Si listamos los contratos, es decir la fecha de contratacin, nos lista todas las fechas an repetidas:
SELECT contrato FROM empleado;

En cambio si slo se requieren las fechas de contratacin sin repetir, la sentencia GROUP BY nos sirve, ya que agrupa las fechas sin repetirlas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 44

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

SELECT contrato FROM empleado GROUP BY contrato;

La clusula GROUP BY permite usar funciones de resumen o reunin. Por ejemplo, la funcin COUNT(), que sirve para contar las filas de cada grupo:

SELECT contrato, COUNT(*) AS cuenta FROM empleado GROUP BY contrato

HAVING Es similar al where. La clusula where determina que registros se seleccionan. De forma parecida, una vez que los registros se agrupan con la clusula group by, la clusula having determina que registros se van a mostrar. Utilice la clusula where para eliminar registros que no desea que se agrupen mediante la clusula group by. La clusula HAVING permite hacer selecciones en situaciones en las que no es posible usar WHERE. Ejemplo:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 45

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Se requiere desplegar los nombres y los lmites de crditos de los clientes y agruparlos por el campo nombre, aun cuando haya nombres repetidos slo desplegar aqul que tenga el crdito mayor de los dos, aunque los dos tengan el lmite de crdito mayor a lo especificado (60,000). Si nicamente se utilizara la condicin que el lmite de crdito sea mayor de 60,000, desplegara lo siguiente:

Pero slo nos interesan aqullos que aunque cumplan la condicin los agrupe por nombre y despliegue nicamente al que tenga el crdito mayor. Por lo tanto se tendr que utilizar la sentencia HAVING que es ms compleja y la consulta quedara de la siguiente manera:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 46

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

SELECT nombre, MAX(limitecredito) FROM clientes GROUP BY nombre HAVING MAX(limitecredito) > 60000

3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN.


Las funciones de agregacin previstas por el estndar SQL son COUNT, SUM, AVG, MAX y MIN, las cuales calculan respectivamente el conteo de campos, la suma, la media aritmtica, el mximo y el mnimo de los valores escalares presentes en la columna a la que se aplican.

Count

Se requiere contar el nmero de registros de la tabla oficinas:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 47

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

SELECT count(*) AS Nmero_de_Oficinas from oficina

SUM

Cul es total del inventario en pesos.

Tabla productos

SELECT SUM(Precio*existencias) AS TOTAL_INVENTARIO FROM Productos

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 48

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

AVG

Sacar el promedio de ventas de los empleados de la oficina 12.

SELECT AVG(Ventas) from empleado WHERE Oficina=12

Como se puede observar son 3 los empleados que pertenecen a la oficina 12, de los cuales saca el promedio de las ventas de ellos nicamente. Todas stas sentencias se pueden combinar con algunas otras, incluso con subconsultas de 2 o ms tablas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 49

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

MAX y MIN

Cul de las productos tiene el mayor precio y cul el menor.

SELECT MAX(Precio) AS Prod_precio_mximo, MIN(Precio) AS Prod_precio_mnimo FROM productos

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 50

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Actividades de la Unidad.

Insercin de valores en tablas. Actualizacin y borrado de registros. Planteamiento y resolucin de consultas con una o ms tablas. Resolucin de consultas complejas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 51

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD IV CONTROL DE TRANSACCIONES

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 52

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Transaccin. Definicin de Transaccin. Se le llama Transaccin a una coleccin de operaciones que forman una unidad lgica de trabajo. Tambin puede definirse como una Secuencia de operaciones que se ejecutan completamente o bien no se realiza, no puede quedarse en un estado intermedio.

Ejemplo:

Una transferencia entre dos cuentas no puede quedarse en un estado intermedio: O se deja el dinero en la primera cuenta o en la segunda, pero no se puede sacar el dinero de la primera cuenta, que falle algo en ese momento y no entregarlo en la segunda.

Cuando una transaccin finaliza con xito, se graba (COMMIT). Si fracasa, se restaura el estado anterior (ROLLBACK).

4.1 Propiedades de la Transaccin


Atomicidad: Se realizan o todas las instrucciones o ninguna.

Correccin (Preservacin consistencia): La transaccin siempre deja la BD en un estado consistente (Si no lo hace puede ser por errores lgicos o fsicos)

Y adems:

Aislamiento: Los efectos de una transaccin no se ven en el exterior hasta que esta finaliza.

Persistencia: Una vez finalizada la transaccin los efectos perduran en la BD.

Seriabilidad: La ejecucin concurrente de varias transacciones debe generar el mismo resultado que la ejecucin en serie de las mismas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 53

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Los pasos para usar transacciones en MySQL son:

1. Iniciar una transaccin con el uso de la sentencia BEGIN. 2. Actualizar, insertar o eliminar registros en la base de datos. 3. Si se quieren los cambios a la base de datos, completar la transaccin con el uso de la sentencia COMMIT. nicamente cuando se procesa un COMMIT los cambios hechos por las consultas sern permanentes. 4. Si sucede algn problema, podemos hacer uso de la sentencia ROLLBACK para cancelar los cambios que han sido realizados por las consultas que han sido ejecutadas hasta el momento. Ejemplo: Crearemos la tabla ejemplo con un solo campo, llamada campo.
mysql> CREATE TABLE ejemplo (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB; Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO ejemplo VALUES(1); Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO ejemplo VALUES(2); Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO ejemplo VALUES(3); Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM ejemplo; +-------+ | campo | +-------+ |1| |2| |3| +-------+ 3 rows in set (0.00 sec)

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 54

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

De acuerdo, nada espectacular. Ahora se ver cmo usar transacciones.


mysql> BEGIN; Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO ejemplo VALUES(4); Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM ejemplo; +-------+ | campo | +-------+ |1| |2| |3| |4| +-------+ 4 rows in set (0.00 sec)

Si en este momento ejecutamos un ROLLBACK, la transaccin no ser completada, y los cambios realizados sobre la tabla no tendrn efecto.
mysql> ROLLBACK; Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM ejemplo; +-------+ | campo | +-------+ |1| |2| |3| +-------+ 3 rows in set (0.00 sec)

Para asegurar una transaccin iniciada con un BEGIN, se utiliza el COMMIT y as se asegura la transaccin.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 55

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

4.2 Grados de consistencia.


Consistencia es un trmino ms amplio que el de integridad. Podra definirse como la coherencia entre todos los datos de la base de datos. Cuando se pierde la integridad tambin se pierde la consistencia. Pero la consistencia tambin puede perderse por razones de funcionamiento.

Una

transaccin

finalizada

(confirmada

parcialmente)

puede

no

confirmarse

definitivamente (consistencia).

Si se confirma definitivamente el sistema asegura la Si se anula los

persistencia de los cambios que ha efectuado en la base de datos. cambios que ha efectuado son deshechos.

La ejecucin de una transaccin debe conducir a un estado de la base de datos consistente (que cumple todas las restricciones de integridad definidas). Si se confirma definitivamente el sistema asegura la persistencia de los cambios que ha efectuado en la base de datos. Si se anula los cambios que ha efectuado son deshechos.

Una transaccin que termina con xito se dice que est comprometida (commited), una transaccin que haya sido comprometida llevar a la base de datos a un nuevo estado consistente que debe permanecer incluso si hay un fallo en el sistema. En cualquier momento una transaccin slo puede estar en uno de los siguientes estados.

Activa (Active): el estado inicial; la transaccin permanece en este estado durante su ejecucin. Parcialmente comprometida (Uncommited): Despus de ejecutarse la ltima transaccin. Fallida (Failed): tras descubrir que no se puede continuar la ejecucin normal. Abortada (Rolled Back): despus de haber retrocedido la transaccin y restablecido la base de datos a su estado anterior al comienzo de la transaccin. Comprometida (Commited): tras completarse con xito.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 56

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Aspectos relacionados al procesamiento de transacciones.

Los siguientes son los aspectos ms importantes relacionados con el procesamiento de transacciones:

Modelo de estructura de transacciones. Es importante considerar si las transacciones son planas o pueden estar anidadas. Consistencia de la base de datos interna. Los algoritmos de control de datos semntico tienen que satisfacer siempre las restricciones de integridad cuando una transaccin pretende hacer un commit.

Protocolos de confiabilidad. En transacciones distribuidas es necesario introducir medios de comunicacin entre los diferentes nodos de una red para garantizar la atomicidad y durabilidad de las transacciones. As tambin, se requieren protocolos para la recuperacin local y para efectuar los compromisos (commit) globales.

Algoritmos de control de concurrencia. Los algoritmos de control de concurrencia deben sincronizar la ejecucin de transacciones concurrentes bajo el criterio de correctitud. La consistencia entre transacciones se garantiza mediante el aislamiento de las mismas.

Protocolos de control de rplicas. El control de rplicas se refiere a cmo garantizar la consistencia mutua de datos replicados. Por ejemplo se puede seguir la estrategia read-one-write-all (ROWA).

4.3 Niveles de aislamiento.


El Nivel de Aislacin (Isolation Level) tiene que ver con serializabilidad. A veces serializabilidad estricta puede ser demasiado exigente Violaciones de Serializabilidad permitidos:

Lectura Sucia: Transaccin T1 realiza una actualizacin de una tupla. T2 lee la tupla actualizada pero poco despus T1 termina con un Rollback (Abort). T2 ha visto informacin que no existe.

Lectura no repetible: Transaccin T1 lee una tupla. T2 actualiza la misma tupla.T1 vuelve a leer la tupla ahora con diferente valor

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 57

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Fantasmas: T1 lee todas las tuplas que satisfacen una condicin. T2 inserta una tupla que tambin satisface. T1 repite la lectura y aparece una tupla nueva(fantasma)

NIVEL DE AISLACIN READ UNCOMMITED READ COMMITED REPEATABLE REPEATABLE READABLE SERIALIZABLE

SUCIA

NO REPETIBLE

FANTASMA

SI NO

SI SI

SI SI

NO

NO

SI

NO

NO

NO

4.4 Instrucciones COMMIT y ROLLBACK


SQL acoge las transacciones de base de datos mediante dos instrucciones de procesamiento de transacciones de SQL: COMMIT: La instruccin COMMIT seala la conclusin con xito de una transaccin. Indica al SGBD que la transaccin se ha completado; se han ejecutado todas las instrucciones que conforman la transaccin, y la base de datos es autoconsistente.

ROLLBACK: La instruccin ROLLBACK seala el fracaso de una transaccin. Indica al SGBD que el usuario no desea completar la transaccin; en lugar de ello, el SGBD debe volverse atrs de las modificaciones realizadas en las BD durante la transaccin. En efecto, el SGBD devuelve la base de datos a su estado previo al comienzo de la transaccin.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 58

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Tres operaciones fundamentales:

Begin: Define el inicio de una unidad de trabajo indivisible (puede ser implcito al ejecutar una operacin de categora transaction-initiating) Commit: Marca el trmino normal de la transaccin, todos los cambios deben quedar reflejados en forma definitiva en la BD y se liberan todos los locks (si los hubieran)

Rollback: Marca una situacin anormal que hace necesario deshacer el camino recorrido ya sea desde el inicio o desde un punto definido anteriormente (Savepoint) dependiendo de esto se liberar todos los locks o solamente aquellos tomados desde el savepoint en cuestin.

Ejemplo:

Ya creada la base de datos y la tabla, haremos un ejemplo sencillo de una tabla con dos campos. Ingresaremos ahora los datos:

Se definen puntos con SAVEPOINT despus de empezada la transaccin con la sentencia BEGIN, con el fin de poder deshacer un bloque de sentencias.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 59

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Se pueden definir ms puntos, dependiendo de las necesidades de ir asegurando las transacciones.

Con el ROLLBACK se puede deshacer el camino recorrido y teniendo puntos salvados, se puede deshacer por partes.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 60

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

El COMMIT asegura la transaccin completa cuando ya se est seguro que los datos y las transacciones sean correctas.

Actividades de la Unidad.

Aplicar el concepto de transaccin. Realizar ejercicios donde utilice los diferentes grados de consistencia y niveles de aislamiento. Realizar prcticas donde se evale como afecta al desempeo el nivel de aislamiento de la transaccin. Realizar prcticas donde se observe la recuperacin de las diferentes fallas de una transaccin.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 61

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD V VISTAS

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 62

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

5.1 Definicin y objetivo de las vistas.


Definicin. Las vistas se pueden definir como tablas virtuales basadas en una o ms tablas o vistas y cuyos contenidos vienen definidos por una consulta sobre las mismas. Esta tabla virtual o consulta se le asigna un nombre y se almacena permanentemente en la BD, generando al igual que en las tablas una entrada en el diccionario de datos. Las vistas permiten que diferentes usuarios vean la BD desde diferentes perspectivas, as como restringir el acceso a los datos de modo que diferentes usuarios accedan slo aciertas filas o columnas de una tabla. Desde el punto de vista del usuario, la vista es como una tabla real con filas y columnas, pero a diferencia de sta, sus datos no se almacenan fsicamente en la BD. Las filas y las columnas de datos visibles a travs de la vista son los resultados producidos por la consulta que define la vista. Objetivos.

Permiten que los diferentes usuarios vean los datos de la forma conveniente de acuerdo a su nivel de conocimientos y experiencia.

A los usuarios especializados, las vistas simplifican sus esquemas facilitando sus consultas.

5.2 Instrucciones para la Administracin de Vistas.


Creacin de vistas

La clusula CREATE VIEW permite la creacin de vistas. La clusula asigna un nombre a la vista y permite especificar la consulta que la define. Su sintaxis es CREATE VIEW id_vista [(columna,)] AS especificacin_consulta;

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 63

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Opcionalmente se puede asignar un nombre a cada columna de la vista. Si se especifica, la lista de nombres de las columnas debe de tener el mismo nmero de elementos que el nmero de columnas producidas por la consulta.

Si se omiten, cada columna de la vista adopta el nombre de la columna correspondiente en la consulta. Existen dos casos en los que es obligatoria la especificacin de la lista de columnas:

Cuando la consulta incluye columnas calculadas.

Cuando la consulta produce nombres idnticos.

Modificacin de Vistas

Si queremos modificar la definicin de nuestra vista podemos utilizar la sentencia ALTER VIEW, de forma muy parecida a como lo hacamos con las tablas. Cabe mencionar que solo se puede modificar la definicin (campos o condiciones de la Vista).

ALTER VIEW Nombre_Vista AS (Parmetros a modificar)

Acceso a Vistas

El usuario accede a los datos de una vista exactamente igual que si estuviera accediendo a una tabla. De hecho, en general, el usuario no sabr que est consultando una vista.

Eliminacin de Vistas

Se hace con DROP VIEW id_vista;

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 64

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Ventajas e inconvenientes de las vistas.

VENTAJAS:

Las consultas con selecciones complejas se simplifican.

Permiten personalizar la BD para los distintos usuarios, de forma que presenten los datos con una estructura lgica para los mismos.

Control de acceso a la BD, haciendo que los usuarios vean y manejen solo determinada informacin.

DESVENTAJAS:

Las restricciones referidas a las actualizaciones.

La cada del rendimiento cuando se construyen vistas con selecciones complejas.

Por ejemplo, si tenemos unas tablas que representan empleados y oficinas, y queremos hacer un listado plano de empleados y sus empleados, podemos ejecutar un query que haga una junta (join) entre estas dos tablas. Pero si posteriormente queremos pedir solo unas lneas de este resultado a partir de otro filtro, vamos a tener que re-ejecutar el query completo, agregando nuestro filtro.

Obviamente es posible, pero tambin implica repetir operaciones anteriores. En el caso de tener pedidos complejos, esto puede resultar en una prdida de eficiencia grande, y mucho trabajo adicional para el desarrollador.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 65

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Ejemplo de Creacin de Vistas

En la pestaa SQL del phpMyAdmin se teclea la sentencia de la vista como una consulta normal.

La vista se realiz correctamente y de lado izquierdo aparece ya la vista agregada como una tabla ms en la Base de Datos, aunque es solamente una tabla lgica a la cual se puede acceder en cualquier momento.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 66

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Aparece la consulta de la vista como un acceso a los datos de una consulta normal, accediendo a la vista como una tabla lgica, en este caso resumenventas

Para borrar la vista, nicamente se escribe la sentencia


DROP VIEW `resumenventas`

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 67

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Otra manera de crear Vistas en phpMyAdmin es desde la parte inferior en la opcin CREATE VIEW.

Posteriormente se teclea la consulta sin la sentencia CREATE VIEW, y se colocan los nombres de los campos como se desean, deben ser exactamente el mismo nmero de campos que se colocan en la etiqueta nombres de las columnas, con respecto a los campos que se piden desplegar en la consulta.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 68

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Actividades de la Unidad.

Crear vistas con cdigo de consultas complejas. Realizar ejercicios donde utilice vistas guardadas como tablas lgicas. Borrar y actualizar vistas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 69

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD VI SEGURIDAD

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 70

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

6.1 Esquemas de Autorizacin


Existen tres preocupaciones respecto a las posibles violaciones de la seguridad en las

BDs

Lectura Modificacin Destruccin de los datos

Para evitar la violacin de la seguridad se deben establecer medidas en todos los niveles del Sistema de Base de Datos

DBMS Sistema Operativo Red Acceso fsico al sitio Recursos Humanos

1.- DBMS.

No se debe permitir a todos los usuarios el mismo tipo de acceso a los datos; por ejemplo, algunos no podrn modificar, solo consultar y, no todos podrn consultar todos los datos. El DBMS deber implementar esos medios de seguridad.

2.- Sistema Operativo.

Debe impedirse el acceso a los archivos y carpetas donde fsicamente se almacenan los datos, excepto los tcnicos o ingenieros responsables

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 71

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

3.- Red.

En la actualidad la gran mayora de las bases de datos permiten acceso desde ubicaciones de red. Asimismo, las estaciones de trabajo estn conectadas a internet. Por lo que las redes deben contar con software y/o hardware de seguridad para evitar accesos no autorizados.

4.- Acceso Fsico al Sitio.

Si se tienen todos los medios de seguridad en Sw y/o HW pero el acceso fsico al lugar donde se encuentra el equipo no se restringe, hay riesgo de que intrusos puedan robar el equipo y tratar de violar con toda calma los medios de seguridad establecidos.

5.- Recursos Humanos.

Debe elegirse cuidadosamente el personal que tendr acceso a datos restringidos para evitar que puedan ser sujetos de sobornos para revelar a intrusos las contraseas o informacin relativa a la seguridad.

En esta unidad solo se enfocar a la seguridad del DBMS, sin embargo es importante considerar que si un organismo solo contempla esta parte y se olvida de las dems, el riesgo de violaciones de seguridad es muy alto.

A los usuarios se les puede otorgar permisos de:

Lectura Insercin Actualizacin

6.2 Instrucciones GRANT y REVOKE


Los comandos GRANT y REVOKE permiten a los administradores de sistemas crear cuentas de usuario MySQL y darles permisos y quitarlos de las cuentas.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 72

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Los permisos pueden darse en varios niveles:

Nivel global Los permisos globales se aplican a todas las bases de datos de un servidor dado. Estos permisos se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.* otorgan y quitan slo permisos globales.

Nivel de base de datos Los permisos de base de datos se aplican a todos los objetos en una base de datos dada. Estos permisos se almacenan en las tablas mysql.db y mysql.host . GRANT ALL ON db_name.* y REVOKE ALL ON db_name.* otorgan y quitan slo permisos de bases de datos.

Nivel de tabla Los permisos de tabla se aplican a todas las columnas en una tabla dada. Estos permisos se almacenan en la tabla mysql.tables_priv . GRANT ALL ON db_name.tbl_name y REVOKE ALL ON db_name.tbl_name otorgan y quitan permisos slo de tabla.

Nivel de columna Los permisos de columna se aplican a columnas en una tabla dada. Estos permisos se almacenan en la tabla mysql.columns_priv . Usando REVOKE, debe especificar las mismas columnas que se otorgaron los permisos.

Nivel de rutina Los permisos CREATE ROUTINE, ALTER ROUTINE, EXECUTE, y GRANT se aplican a rutinas almacenadas. Pueden darse a niveles global y de base de datos. Adems, excepto para CREATE ROUTINE, estos permisos pueden darse en nivel de rutinas para rutinas individuales y se almacenan en la tabla mysql.procs_priv .

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 73

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Para los comandos GRANT y REVOKE , priv_type pueden especificarse como cualquiera de los siguientes:
Permiso ALL [PRIVILEGES] ALTER ALTER ROUTINE CREATE CREATE ROUTINE CREATE TEMPORARY TABLES CREATE USER Permite el uso de CREATE USER, DROP USER, RENAME USER, y REVOKE ALL PRIVILEGES. CREATE VIEW DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS REFERENCES RELOAD REPLICATION CLIENT REPLICATION SLAVE SELECT SHOW DATABASES SHOW VIEW SHUTDOWN SUPER Necesario para los esclavos de replicacin (para leer eventos del log binario desde el maestro) Permite el uso de SELECT SHOW DATABASES muestra todas las bases de datos Permite el uso de SHOW CREATE VIEW Permite el uso de mysqladmin shutdown Permite el uso de comandos CHANGE MASTER, KILL, PURGE MASTER LOGS, and SET GLOBAL , el comando mysqladmin debug le permite conectar (una vez) incluso si se llega a max_connections UPDATE USAGE GRANT OPTION Permite el uso de UPDATE Sinnimo de no privileges Permite dar permisos Permite el uso de CREATE VIEW Permite el uso de DELETE Permite el uso de DROP TABLE Permite al usuario ejecutar rutinas almacenadas Permite el uso de SELECT ... INTO OUTFILE y LOAD DATA INFILE Permite el uso de CREATE INDEX y DROP INDEX Permite el uso de INSERT Permite el uso de LOCK TABLES en tablas para las que tenga el permiso SELECT Permite el uso de SHOW FULL PROCESSLIST No implementado Permite el uso de FLUSH Permite al usuario preguntar dnde estn los servidores maestro o esclavo Significado Da todos los permisos simples excepto GRANT OPTION Permite el uso de ALTER TABLE Modifica o borra rutinas almacenadas Permite el uso de CREATE TABLE Crea rutinas almacenadas Permite el uso de CREATE TEMPORARY TABLE

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 74

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Sintaxis: GRANT
GRANT privilegios (columnas) ON elemento TO nombre_usuario IDENTIFIED BY 'contrasea' (whith grant option);

REVOKE
REVOKE privilegios [(columnas)] ON elemento FROM nopmbre_de_usuario

Para configurar un administrador, podemos escribir:


mysql > grant all on * to TBD identified by 'Qe4w' with grant option; mysql > revoke all on * from TBD;

Para Configurar un usuario normal:


mysql > grant usage on empresa .* to TBD identified by 'Qe4w';

A partir de ahora le concedemos los privilegios en funcin de los que nos ha pedido hacer, poniendo los privilegios adecuados
mysql > grant select, insert, update, delete, index, alter, create, drop on empresa .* to TBD; mysql > revoke alter, create, drop on empresa.* from TBD; mysql > revoke all on empresa.* from TBD;

Actividades de la Unidad.

Aplicar el concepto de autorizaciones y privilegios. Crear grupos de usuarios y asignar sus privilegios.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 75

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

UNIDAD VII INTRODUCCIN AL SQL PROCEDURAL

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 76

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

7.1 Procedimientos almacenados.


Pues es un programa que se almacena fsicamente en una tabla dentro del sistema de bases de datos. Este programa est hecho con un lenguaje propio de cada Gestor de BD y esta compilado, por lo que la velocidad de ejecucin ser muy rpida. Principales Ventajas

Seguridad. Cuando llamamos a un procedimiento almacenado, este deber realizar todas las comprobaciones pertinentes de seguridad y seleccionar la informacin lo ms precisamente posible, para enviar de vuelta la informacin justa y necesaria y que por la red corra el mnimo de informacin, consiguiendo as un aumento del rendimiento de la red considerable.

Rendimiento. El SGBD, en este caso MySQL, es capaz de trabajar ms rpido con los datos que cualquier lenguaje del lado del servidor, y llevar a cabo las tareas con ms eficiencia. Solo realizamos una conexin al servidor y este ya es capaz de realizar todas las comprobaciones sin tener que volver a establecer una conexin. Esto es muy importante, una vez le que cada conexin con la BD puede tardar hasta medios segundo, imagnate en un ambiente de produccin con muchas visitas como puede perjudicar esto a nuestra aplicacin Otra ventaja es la posibilidad de separar la carga del servidor, ya que si disponemos de un servidor de base de datos externo estaremos descargando al servidor web de la carga de procesamiento de los datos.

Reutilizacin: el procedimiento almacenado podr ser invocado desde cualquier parte del programa, y no tendremos que volver a armar la consulta a la BD cada que vez que queramos obtener unos datos.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 77

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Desventajas:

El programa se guarda en la BD, por lo tanto si se corrompe y perdemos la informacin tambin perderemos nuestros procedimientos. Esto es fcilmente subsanable llevando a cabo una buena poltica de respaldos de la BD.

Tener que aprender un nuevo lenguaje esto es siempre un engorro, sobre todo si no tienes tiempo.

Por lo tanto es recomendable usar procedimientos almacenados siempre que se vaya a hacer una aplicacin grande, ya que nos facilitar la tarea bastante y nuestra aplicacin ser ms rpida. Vamos a ver un ejemplo. Abrimos una consola de MySQL seleccionamos una base de datos y empezamos a escribir: Vamos a crear dos tablas en una almacenaremos las personas mayores de 18 aos y en otra las personas menores.
CREATE TABLE ninos(edad int, nombre varchar(50)); CREATE TABLE adultos(edad int, nombre varchar(50));

Imagnate que ahora queremos introducir personas en las tablas pero dependiendo de la edad queremos que se introduzcan en una tabla u otra, si estamos usando PHP podramos comprobar mediante cdigo si la persona es mayor de edad. Lo haramos as:
$nombre = $_POST[nombre]; $edad = $_POST[edad]; if($edad &lt; 18){ mysql_query(insert into ninos values( . $edad . , .$nombre.)); }else{ mysql_query(insert into adultos values( . $edad . , .$nombre.)); }

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 78

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Si la consulta es corta como en este caso, esta forma es incluso ms rpida que tener que crear un procedimiento almacenado, pero si tienes que hacer esto muchas veces a lo largo de tu aplicacin es mejor hacer lo siguiente: Creamos el procedimiento almacenado:
delimiter // CREATE procedure varchar(50)) begin IF edad &lt; 18 then INSERT INTO ninos VALUES(edad,nombre); else INSERT INTO adultos VALUES(edad,nombre); end IF; end; // introducePersona(IN edad int,IN nombre

Ya tenemos nuestro procedimiento, vamos a por una visin ms detallada. La primera lnea es para decirle a MySQL que a partir de ahora hasta que no introduzcamos // no se acaba la sentencia, esto lo hacemos as porque en nuestro procedimiento almacenado tendremos que introducir el caracter ; para las sentencias, y si pulamos enter MySQL pensar que ya hemos acabado la consulta y dar error. Con CREATE PROCEDURE empezamos la definicin de procedimiento con nombre introducePersona. En un procedimiento almacenado existen parmetros de entrada y de salida, los de entrada (precedidos de IN) son los que le pasamos para usar dentro del procedimiento y los de salida (precedidos de OUT) son variables que se establecern a lo largo del procedimiento y una vez esta haya finalizado podremos usar ya que se quedaran en la sesin de MySQL. En este procedimiento simple solo vamos usar de entrada, ms adelante veremos cmo usar parmetros de salida.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 79

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Para hacer una llamada a nuestro procedimiento almacenado usaremos la sentencia CALL:
call introducePersona(25,JoseManuel);

Una vez tenemos ya nuestro procedimiento simplemente lo ejecutaremos desde PHP mediante una llamada como esta:
$nombre = $_POST['nombre']; $edad = $_POST['edad']; mysql_query(call introducePersona( . $edad . , .$nombre. ););

De ahora en adelante, usaremos siempre el procedimiento para introducir personas en nuestra BD de manera que si tenemos 20 scripts PHP que lo usan y un buen da decidimos que la forma de introducir personas no es la correcta, solo tendremos que modificar el procedimiento introducePersona y no los 20 scripts.

7.2 Disparadores (Triggers)


Un disparador es un objeto de base de datos con nombre que se asocia a una tabla, y se activa cuando ocurre un evento en particular para la tabla. Algunos usos para los disparadores es verificar valores a ser insertados o llevar a cabo clculos sobre valores involucrados en una actualizacin. Un disparador se asocia con una tabla y se define para que se active al ocurrir una sentencia INSERT, DELETE, o UPDATE sobre dicha tabla. Puede tambin establecerse que se active antes o despues de la sentencia en cuestin. Por ejemplo, se puede tener un disparador que se active antes de que un registro sea borrado, o despus de que sea actualizado. Para crear o eliminar un disparador, se emplean las sentencias CREATE TRIGGER y DROP
TRIGGER.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 80

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Este es un ejemplo sencillo que asocia un disparador con una tabla para cuando reciba sentencias INSERT. Acta como un acumulador que suma los valores insertados en una de las columnas de la tabla. La siguiente sentencia crea la tabla y un disparador asociado a ella:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount;

La sentencia CREATE TRIGGER crea un disparador llamado ins_sum que se asocia con la tabla account. Tambin se incluyen clusulas que especifican el momento de activacin, el evento activador, y qu hacer luego de la activacin:

La palabra clave BEFORE indica el momento de accin del disparador. En este caso, el disparador debera activarse antes de que cada registro se inserte en la tabla. La otra palabra clave posible aqu es AFTER.

La palabra clave INSERT indica el evento que activar al disparador. En el ejemplo, la sentencia INSERT causar la activacin. Tambin pueden crearse disparadores para sentencias DELETE y UPDATE.

La sentencia siguiente, FOR EACH ROW, define lo que se ejecutar cada vez que el disparador se active, lo cual ocurre una vez por cada fila afectada por la sentencia activadora. En el ejemplo, la sentencia activada es un sencillo SET que acumula los valores insertados en la columna amount. La sentencia se refiere a la columna como NEW.amount, lo que significa el valor de la columna amount que ser insertado en el nuevo registro.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 81

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Para utilizar el disparador, se debe establecer el valor de la variable acumulador a cero, ejecutar una sentencia INSERT, y ver qu valor presenta luego la variable.
mysql> SET @sum = 0; mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,100.00); mysql> SELECT @sum AS 'Total amount inserted'; +-----------------------+ | Total amount inserted | +-----------------------+ | 1852.48 | +-----------------------+

En este caso, el valor de @sum luego de haber ejecutado la sentencia INSERT es 14.98 +
1937.50 - 100,

o 1852.48.

Para eliminar el disparador, se emplea una sentencia DROP TRIGGER. El nombre del disparador debe incluir el nombre de la tabla:
mysql> DROP TRIGGER account.ins_sum;

Debido a que un disparador est asociado con una tabla en particular, no se pueden tener mltiples disparadores con el mismo nombre dentro de una tabla. Tambin se debera tener en cuenta que el espacio de nombres de los disparadores puede cambiar en el futuro de un nivel de tabla a un nivel de base de datos, es decir, los nombres de disparadores ya no slo deberan ser nicos para cada tabla sino para toda la base de datos. Para una mejor compatibilidad con desarrollos futuros, se debe intentar emplear nombres de disparadores que no se repitan dentro de la base de datos. Adicionalmente al requisito de nombres nicos de disparador en cada tabla, hay otras limitaciones en los tipos de disparadores que pueden crearse. En particular, no se pueden tener dos disparadores para una misma tabla que sean activados en el mismo momento y por el mismo evento. Por ejemplo, no se pueden definir dos BEFORE INSERT o dos AFTER
UPDATE en una misma tabla. Es improbable que esta sea una gran limitacin, porque es

posible definir un disparador que ejecute mltiples sentencias empleando el constructor de sentencias compuestas BEGIN ... END luego de FOR EACH ROW

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 82

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Tambin hay limitaciones sobre lo que puede aparecer dentro de la sentencia que el disparador ejecutar al activarse:

El disparador no puede referirse a tablas directamente por su nombre, incluyendo la misma tabla a la que est asociado. Sin embargo, se pueden emplear las palabras clave OLD y NEW. OLD se refiere a un registro existente que va a borrarse o que va a actualizarse antes de que esto ocurra. NEW se refiere a un registro nuevo que se insertar o a un registro modificado luego de que ocurre la modificacin.

El disparador no puede invocar procedimientos almacenados utilizando la sentencia CALL. (Esto significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para eludir la prohibicin de referirse a tablas por su nombre).

El disparador no puede utilizar sentencias que inicien o finalicen una transaccin, tal como START TRANSACTION, COMMIT, o ROLLBACK.

Las palabras clave OLD y NEW permiten acceder a columnas en los registros afectados por un disparador. (OLD y NEW no son sensibles a maysculas). En un disparador para INSERT, solamente puede utilizarse NEW.nom_col; ya que no hay una versin anterior del registro. En un disparador para DELETE slo puede emplearse OLD.nom_col, porque no hay un nuevo registro. En un disparador para UPDATE se puede emplear OLD.nom_col para referirse a las columnas de un registro antes de que sea actualizado, y NEW.nom_col para referirse a las columnas del registro luego de actualizarlo. Una columna precedida por OLD es de slo lectura. Es posible hacer referencia a ella pero no modificarla. Una columna precedida por NEW puede ser referenciada si se tiene el privilegio SELECT sobre ella. En un disparador BEFORE, tambin es posible cambiar su valor con SET NEW.nombre_col = valor si se tiene el privilegio de UPDATE sobre ella. Esto significa que un disparador puede usarse para modificar los valores antes que se inserten en un nuevo registro o se empleen para actualizar uno existente. En un disparador BEFORE, el valor de NEW para una columna AUTO_INCREMENT es 0, no el nmero secuencial que se generar en forma automtica cuando el registro sea realmente insertado.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 83

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

OLD y NEW son extensiones de MySQL para los disparadores.

Empleando el constructor BEGIN ... END, se puede definir un disparador que ejecute sentencias mltiples. Dentro del bloque BEGIN, tambin pueden utilizarse otras sintaxis permitidas en rutinas almacenadas, tales como condicionales y bucles. Como sucede con las rutinas almacenadas, cuando se crea un disparador que ejecuta sentencias mltiples, se hace necesario redefinir el delimitador de sentencias si se ingresar el disparador a travs del programa mysql, de forma que se pueda utilizar el caracter ';' dentro de la definicin del disparador. El siguiente ejemplo ilustra estos aspectos. En l se crea un disparador para UPDATE, que verifica los valores utilizados para actualizar cada columna, y modifica el valor para que se encuentre en un rango de 0 a 100. Esto debe hacerse en un disparador BEFORE porque los valores deben verificarse antes de emplearse para actualizar el registro:
mysql> delimiter // mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account -> FOR EACH ROW -> BEGIN -> -> -> -> -> -> END;// mysql> delimiter ; IF NEW.amount < 0 THEN SET NEW.amount = 0; ELSEIF NEW.amount > 100 THEN SET NEW.amount = 100; END IF;

Podra parecer ms fcil definir una rutina almacenada e invocarla desde el disparador utilizando una simple sentencia CALL. Esto sera ventajoso tambin si se deseara invocar la misma rutina desde distintos disparadores. Sin embargo, una limitacin de los disparadores es que no pueden utilizar CALL. Se debe escribir la sentencia compuesta en cada CREATE TRIGGER donde se la desee emplear. MySQL gestiona los errores ocurridos durante la ejecucin de disparadores de esta manera:

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 84

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

Si lo que falla es un disparador BEFORE, no se ejecuta la operacin en el correspondiente registro.

Un disparador AFTER se ejecuta solamente si el disparador BEFORE (de existir) y la operacin se ejecutaron exitosamente.

Un error durante la ejecucin de un disparador BEFORE o AFTER deriva en la falla de toda la sentencia que provoc la invocacin del disparador.

En tablas transaccionales, la falla de un disparador (y por lo tanto de toda la sentencia) debera causar la cancelacin (rollback) de todos los cambios realizados por esa sentencia. En tablas no transaccionales, cualquier cambio realizado antes del error no se ve afectado.

Actividades de la Unidad.

Programar procedimientos almacenados para realizar algunas tareas en el Sistema Manejador de Bases de Datos. Implementar algunas restricciones de integridad, programando disparadores.

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 85

INSTITUTO TECNOLGICO DE TUXTEPEC

TALLER DE BASES DE DATOS

FUENTES DE INFORMACIN.

1. Silberschatz, Abraham. Fundamentos de Base de Datos. Mc Graw Hill. 2. Sayless Jonathan. How to use Oracle, SQL PLus. Ed. QED. 3. Koch & Muller. Oracle9i: The Complete Reference. Mc Graw Hill. 4. Tim Martn & Tim Hartley. DB2/SQL Mc Graw Hill. 5. http://www.htmlpoint.com/sql/sql_07.htm 6. http://elvex.ugr.es/idbis/db/docs/intro/B%20Bases%20de%20Datos.pdf 7. http://www.guebs.com/manuales/mysql-5.0/introduction.html 8. http://www.nosolocodigo.com/procedimientos-almacenados-con-mysql-5 9. http://dev.mysql.com/doc/refman/5.0/es/index.html 10. http://www.mysql.com

ARR, MMHC

INGENIERA EN SISTEMAS COMPUTACIONALES

Pgina 86

También podría gustarte