Manual Completo Mysql
Manual Completo Mysql
Manual Completo Mysql
net
Los comandos SQL (SELECT, INSERT,...) pueden ser partidos por espacios o saltos de lnea antes de finalizar la instruccin Se pueden tabular lneas para facilitar la lectura si fuera necesario Los comentarios en el cdigo SQL comienzan por /* y terminan por */ (excepto en algunos SGBD)
[5.4] DDL
[5.4.1] introduccin
El DDL es la parte del lenguaje que realiza la funcin de definicin de datos. Fundamentalmente se encarga de la creacin de esquemas, tablas y vistas. Por ahora veremos como crear tablas. Cada usuario de una base de datos posee un esquema. El esquema suele tener el mismo nombre que el usuario y sirve para almacenar los objetos de esquema, es decir los objetos que posee el usuario. Esos objetos pueden ser: tablas, vistas, ndices y otras objetos relacionados con la definicin de la base de datos. Los objetos son manipulados y creados por los usuarios. En principio slo los administradores y los usuarios propietarios pueden acceder a cada objeto, salvo que se modifiquen los privilegios del objeto para permitir el acceso a otros usuarios. Hay que tener en cuenta que ninguna instruccin DDL puede ser anulada por una instruccin ROLLBACK (la instruccin ROLLBACK est relacionada con el uso de transacciones que se comentarn ms adelante) por lo que hay que tener mucha precaucin a la hora de utilizarlas. Es decir, las instrucciones DDL son definitivas.
[73]
el lenguaje SQL Pero normalmente se indican ms parmetros. Ejemplo: CREATE DATABASE prueba LOGFILE prueba.log MAXLOGFILES 25 MAXINSTANCES 10 ARCHIVELOG CHARACTER SET WIN1214 NATIONAL CHARACTER SET UTF8 DATAFILE prueba1.dbf AUTOEXTEND ON MAXSIZE 500MB;
[74]
orden DESCRIBE
El comando DESCRIBE, permite obtener la estructura de una tabla. Ejemplo: DESCRIBE existencias; Y aparecern los campos de la tabla proveedores. Esta instruccin no es parte del SQL estndar, pero casi es considerada as ya que casi todos los SGBD la utilizan.
[75]
[76]
Descripcin
Texto de anchura fija Texto de anchura variable Texto de anchura fija para caracteres nacionales Texto de anchura variable para caracteres nacionales
SQL Server
CHAR(n) VARCHAR(n)
Oracle SQL
CHAR(n) VARCHAR2(n)
Tipo MySQL
CHAR(n) VARCHAR(n)
NCHAR(n)
NCHAR(n)
NVARCHAR(n)
NVARCHAR2(n)
NCHAR VARYING(n)
Enteros
NUMBER(38)
NUMBER
FLOAT(m,d) DOUBLE(m,d)
NUMERIC(m,d) DECIMAL(m,d)
NUMBER(m,d) DECIMAL(m,d) DATE DATE TIMESTAMP DATETIME TIME INTERVAL YEAR TIMESTAMP
Intervalos
INTERVAL
[77]
el lenguaje SQL
Descripcin
Lgicos
SQL Server
BINARY TEXT y NTEXT
Oracle SQL
Tipo MySQL
BIT BOOL
TEXT, MEDIUM TEXT y LONG TEXT BLOB, MEDIUM BLOB y LONG BLOB
BLOB
IMAGE
textos
Para los textos disponemos de los siguientes tipos (Oracle): VARCHAR . Para textos de longitud variable. Su tamao depende de la base de datos (en Oracle es de 4000) CHAR. Para textos de longitud fija (en Oracle hasta 2000 caracteres). NCHAR. Para el almacenamiento de caracteres nacionales de texto fijo NVARCHAR. Para el almacenamiento de caracteres nacionales de longitud variable. En todos estos tipos se indican los tamaos entre parntesis tras el nombre del tipo. Conviene poner suficiente espacio para almacenar los valores. En el caso de los VARCHAR, no se malgasta espacio por poner ms espacio del deseado ya que si el texto es ms pequeo que el tamao indicado, el resto del espacio se ocupa.
nmeros
Si son enteros se indican con INT (en Oracle es el tipo NUMBER seguido del tamao) que equivale a los long del lenguaje C. Si son decimales se elige FLOAT o DOUBLE si se desea precisin doble. En Oracle es el tipo NUMBER a secas, seguido de dos nmeros separados por comas. Tambin existe la posibilidad de utilizar el tipo DECIMAL que representa decimales de longitud fija (gastan ms espacio, pero son ms precisos). En ese caso se indica el tamao completo del nmero y el nmero de decimales. Por ejemplo, DECIMAL (8,3) indica que se representan nmeros de ocho cifras de precisin y tres decimales. En Oracle se usa igual pero sustituyendo la palabra DECIMAL por la palabra NUMBER (NUMBER(8,3) por ejemplo). Las cifras de precisin incluyen los decimales, es decir para almacenar el nmero 64563,2345 se usara NUMBER(9,4) (o DECIMAL(9,4)).
TIMESTAMP
Es una extensin del anterior, almacena valores de da, mes y ao, junto con hora, minuto y segundos (incluso con decimales). Con lo que representa un instante concreto en el tiempo. Un ejemplo de TIMESTAMP sera 2/2/2004 18:34:23,34521. En este caso si el formato de fecha y hora del sistema est pensado para el idioma espaol, el separador decimal ser la coma (y no el punto).
intervalos
Sirven para almacenar intervalos de tiempo (no fechas, sino una suma de elementos de tiempo). En el caso de Oracle son: INTERVAL YEAR TO MONTH Este tipo de datos almacena aos y meses. Tras la palabra YEAR se puede indicar la precisin de los aos (cifras del ao), por defecto es de dos. Ejemplo: CREATE TABLE tiempos (meses INTERVAL YEAR(3) TO MONTH); INSERT INTO tiempos VALUES(3-2); En el ejemplo se inserta un registro que representa 3 aos y dos meses. INTERVAL DAY TO SECOND Representa intervalos de tiempo que expresan das, horas, minutos y segundos. Se puede indicar la precisin tras el texto DAY y el nmero de decimales de los segundos tras el texto SECOND. Ejemplo: CREATE TABLE tiempos (dias INTERVAL DAY(3) TO SECOND(0)); INSERT INTO tiempos VALUES(2 7:12:23);
el lenguaje SQL
modificar tablas
La verstil instruccin ALTER TABLE permite hacer cambios en la estructura de una tabla.
aadir columnas
ALTER TABLE nombreTabla ADD(nombreColumna TipoDatos [Propiedades] [,columnaSiguiente tipoDatos [propiedades]...) Permite aadir nuevas columnas a la tabla. Se deben indicar su tipo de datos y sus propiedades si es necesario (al estilo de CREATE TABLE). Las nuevas columnas se aaden al final, no se puede indicar otra posicin. Ejemplo: ALTER TABLE facturas ADD (fecha DATE)
borrar columnas
ALTER TABLE nombreTabla DROP(columna [,columnaSiguiente,...]); Elimina la columna indicada de manera irreversible e incluyendo los datos que contena. No se puede eliminar la ltima columna (habr que usar DROP TABLE). ALTER TABLE facturas DROP (fecha);
modificar columna
Permite cambiar el tipo de datos y propiedades de una determinada columna. Sintaxis: ALTER TABLE nombreTabla MODIFY(columna tipo [propiedades] [columnaSiguiente tipo [propiedades] ...] Los cambios que se permiten son (en Oracle): Incrementar precisin o anchura de los tipos de datos Slo se puede reducir la anchura si la anchura mxima de un campo si esa columna posee nulos en todos los registros, o todos los valores so o no hay registros Se puede pasar de CHAR a VARCHAR y viceversa (si no se modifica la anchura) Se puede pasar de DATE a TIMESTAMP y viceversa Ejemplo: ALTER TABLE facturas MODIFY(fecha TIMESTAMP);
renombrar columna
Esto permite cambiar el nombre de una columna. Sintaxis ALTER TABLE nombreTabla RENAME COLUMN nombreAntiguo TO nombreNuevo Ejemplo: [80]
[5.4.11] restricciones
Una restriccin es una condicin de obligado cumplimiento para una o ms columnas de la tabla. A cada restriccin se le pone un nombre, en el caso de no poner un nombre (en las que eso sea posible) entonces el propio Oracle le coloca el nombre que es un mnemotcnico con el nombre de tabla, columna y tipo de restriccin. Su sintaxis general es: {CREATE TABLE nombreTabla | ALTER TABLE nombreTabla {ADD | MODIFY}} (campo tipo [propiedades] [,...] CONSTRAINT nombreRestriccin tipoRestriccin (columnas) [,CONSTRAINT nombrerestriccin tipoRestriccin (columnas) ...) Las restricciones tienen un nombre, se puede hacer que sea Oracle el que les ponga nombre, pero entonces ser crptico. Por eso es mejor ponerle uno mismo. Los nombres de restriccin no se pueden repetir para el mismo esquema, por lo que es buena idea incluir de algn modo el nombre de la tabla, los campos involucrados y el tipo de restriccin en el nombre de la misma. Por ejemplo pieza_id_pk podra indicar que el campo id de la tabla pieza tiene una clave principal (PRIMARY KEY). Oracle aconseja esta regla a la hora de poner nombre a las restricciones: Tres letras para el nombre de la tabla Carcter de subrayado Tres letras con la columna afectada por la restriccin Carcter de subrayado Dos letras con la abreviatura del tipo de restriccin. La abreviatura puede ser: NN. NOT NULL. PK. PRIMARY KEY [81]
el lenguaje SQL UK. UNIQUE FK. FOREIGN KEY CK. CHECK (validacin) Por ejemplo para hacer que la clave principal de la tabla Alumnos sea el cdigo del alumno, el nombre de la restriccin podra ser: alu_cod_pk
prohibir nulos
La restriccin NOT NULL permite prohibir los nulos en una determinada tabla. Eso obliga a que la columna tenga que tener obligatoriamente un valor para que sea almacenado el registro. Se puede colocar durante la creacin (o modificacin) del campo aadiendo la palabra NOT NULL tras el tipo: CREATE TABLE cliente(dni VARCHAR2(9) NOT NULL); En ese caso el nombre le coloca la propia base de datos (en el caso de Oracle el nombre sera algo como SY002341 por ejemplo). No es recomendable no poner nombre a las restricciones para controlarlas mejor. Para poner el nombre se usa: CREATE TABLE cliente(dni VARCHAR2(9) CONSTRAINT cli_dni_nn NOT NULL); La restriccin NOT NULL es la nica que slo se puede poner seguida al nombre de la columna a la que se aplica (la razn es que NOT NULL slo se puede aplicar a un campo a la vez)
valores nicos
Las restricciones de tipo UNIQUE obligan a que el contenido de una o ms columnas no puedan repetir valores. Nuevamente hay dos formas de colocar esta restriccin: CREATE TABLE cliente(dni VARCHAR2(9) UNIQUE); En ese caso el nombre de la restriccin la coloca el sistema Oracle. Otra forma es: CREATE TABLE cliente(dni VARCHAR2(9) CONSTRAINT dni_u UNIQUE); Esta forma permite poner un nombre a la restriccin. Si la repeticin de valores se refiere a varios campos, la forma sera: CREATE TABLE alquiler(dni VARCHAR2(9), cod_pelicula NUMBER(5), CONSTRAINT alquiler_uk UNIQUE(dni,cod_pelicula) ; La coma tras la definicin del campo cod_pelicula hace que la restriccin sea independiente de ese campo. Eso obliga a que, tras UNIQUE se indique la lista de [82]
campos. Incluso para un solo campo se puede colocar la restriccin al final de la lista en lugar de definirlo a continuacin del nombre y tipo de la columna. Las claves candidatas deben llevar restricciones UNIQUE y NOT NULL
clave primaria
La clave primaria de una tabla la forman las columnas que indican a cada registro de la misma. La clave primaria hace que los campos que la forman sean NOT NULL (sin posibilidad de quedar vacos) y que los valores de los campos sean de tipo UNIQUE (sin posibilidad de repeticin). Si la clave est formada por un solo campo basta con: CREATE TABLE cliente( dni VARCHAR2(9) PRIMARY KEY, nombre VARCHAR(50)) ; O, poniendo un nombre a la restriccin: CREATE TABLE cliente( dni VARCHAR2(9) CONSTRAINT cliente_pk PRIMARY KEY, nombre VARCHAR(50)) ; Si la clave est formada por ms de un campo: CREATE TABLE alquiler(dni VARCHAR2(9), cod_pelicula NUMBER(5), CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula) ;
[83]
el lenguaje SQL Si el campo al que se hace referencia es la clave principal, se puede obviar el nombre del campo: CREATE TABLE alquiler( dni VARCHAR2(9) CONSTRAINT dni_fk REFERENCES clientes, cod_pelicula NUMBER(5) CONSTRAINT pelicula_fk REFERENCES peliculas, CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula) ); En este caso se entiende que los campos hacen referencia a las claves principales de las tablas referenciadas (si la relacin la forma ms un campo, el orden de los campos debe de ser el mismo). Esto forma una relacin entre dichas tablas, que adems obliga al cumplimiento de la integridad referencial. Esta integridad obliga a que cualquier dni incluido en la tabla alquiler tenga que estar obligatoriamente en la tabla de clientes. De no ser as el registro no ser insertado en la tabla (ocurrir un error). Otra forma de crear claves forneas (til para claves formadas por ms de un campo) es: CREATE TABLE existencias( tipo CHAR2(9), modelo NUMBER(3), n_almacen NUMBER(1) cantidad NUMBER(7), CONSTRAINT exi_t_m_fk FOREIGN KEY(tipo,modelo) REFERENCES piezas, CONSTRAINT exi_nal_fk FOREIGN KEY(n_almacen) REFERENCES almacenes, CONSTRAINT exi_pk PRIMARY KEY(tipo,modelo,n_almacen) ); Si la definicin de clave secundaria se pone al final hace falta colocar el texto FOREIGN KEY para indicar en qu campos se coloca la restriccin de clave fornea. En el ejemplo anterior es absolutamente necesario que forman la clave principal de la tabla piezas a la que hace referencia la clave sean tipo y modelo y en que estn en ese orden. La integridad referencial es una herramienta imprescindible de las bases de datos relacionales. Pero provoca varios problemas. Por ejemplo, si borramos un registro en la tabla principal que est relacionado con uno o varios de la secundaria ocurrir un error, ya que de permitrsenos borrar el registro ocurrir fallo de integridad (habr claves secundarios refirindose a una clave principal que ya no existe). Por ello se nos pueden ofrecer soluciones a aadir tras la clusula REFERENCES: ON DELETE SET NULL. Coloca nulos todas las claves secundarias relacionadas con la borrada. ON DELETE CASCADE. Borra todos los registros cuya clave secundaria es igual que la clave del registro borrado. [84]
ON DELETE SET DEFAULT. Coloca en el registro relacionado el valor por defecto en la columna relacionada ON DELETE NOTHING. No hace nada. En esas cuatro clusulas se podra sustituir la palabra DELETE por la palabra UPDATE, haciendo que el funcionamiento se refiera a cuando se modifica un registro de la tabla principal. En la base de datos Oracle slo se permite utilizar ON DELETE SET NULL o ON DELETE CASCADE. La sintaxis completa para aadir claves forneas es: CREATE TABLE tabla(lista_de_campos CONSTRAINT nombreRestriccion FOREIGN KEY (listaCampos) REFERENCES tabla(clavePrincipalRelacionada) [ON UPDATE {SET NULL | CASCADE}] ); Si es de un solo campo existe esta alternativa: CREATE TABLE tabla(lista_de_campos tipos propiedades, nombreCampoClaveSecundaria CONSTRAINT nombreRestriccion REFERENCES tabla(clavePrincipalRelacionada) [ON UPDATE {SET NULL | CASCADE}] ); Ejemplo (no vlido para Oracle, por el uso de ON UPDATE): CREATE TABLE alquiler(dni VARCHAR2(9), cod_pelicula NUMBER(5), CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula), CONSTRAINT dni_fk FOREIGN KEY (dni) REFERENCES clientes(dni) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT pelicula_fk FOREIGN KEY (cod_pelicula) REFERENCES peliculas(cod) ON DELETE CASCADE );
[85]
el lenguaje SQL
restricciones de validacin
Son restricciones que dictan una condicin que deben cumplir los contenidos de una columna. Una misma columna puede tener mltiples CHECKS en su definicin (se pondran varios CONSTRAINT seguidos, sin comas). Ejemplo: CREATE TABLE ingresos(cod NUMBER(5) PRIMARY KEY, concepto VARCHAR2(40) NOT NULL, importe NUMBER(11,2) CONSTRAINT importe_min CHECK (importe>0) CONSTRAINT importe_max CHECK (importe<8000) ); En este caso la CHECK prohbe aadir datos cuyo importe no est entre 0 y 8000 Para poder hacer referencia a otras columnas hay que construir la restriccin de forma independiente a la columna (es decir al final de la tabla): CREATE TABLE ingresos(cod NUMBER(5) PRIMARY KEY, concepto VARCHAR2(40) NOT NULL, importe_max NUMBER(11,2), importe NUMBER(11,2), CONSTRAINT importe_maximo CHECK (importe<importe_max) );
aadir restricciones
Es posible querer aadir restricciones tras haber creado la tabla. En ese caso se utiliza la siguiente sintaxis: ALTER TABLE tabla ADD [CONSTRAINT nombre] tipoDeRestriccin(columnas); tipoRestriccin es el texto CHECK, PRIMARY KEY o FOREIGN KEY. Las restricciones NOT NULL deben indicarse mediante ALTER TABLE .. MODIFY colocando NOT NULL en el campo que se modifica.
[86]
borrar restricciones
Sintaxis: ALTER TABLE tabla DROP PRIMARY KEY | UNIQUE(campos) | CONSTRAINT nombreRestriccin [CASCADE] La opcin PRIMARY KEY elimina una clave principal (tambin quitar el ndice UNIQUE sobre las campos que formaban la clave. UNIQUE elimina ndices nicos. La opcin CONSTRAINT elimina la restriccin indicada. La opcin CASCADE hace que se eliminen en cascada las restricciones de integridad que dependen de la restriccin eliminada. Por ejemplo en: CREATE TABLE curso( cod_curso CHAR(7) PRIMARY KEY, fecha_inicio DATE, fecha_fin DATE, tItulo VARCHAR2(60), cod_siguientecurso CHAR(7), CONSTRAINT fecha_ck CHECK(fecha_fin>fecha_inicio), CONSTRAINT cod_ste_fk FOREIGN KEY(cod_siguientecurso) REFERENCES curso ON DELETE SET NULL); Tras esa definicin de tabla, esta instruccin: ALTER TABLE curso DROP PRIMARY KEY; Produce este error (en la base de datos Oracle): ORA-02273: a esta clave nica/primaria hacen referencia algunas claves ajenas Para ello habra que utilizar esta instruccin: ALTER TABLE curso DROP PRIMARY KEY CASCADE; Esa instruccin elimina la restriccin de clave secundaria antes de eliminar la principal. Tambin produce error esta instruccin: ALTER TABLE curso DROP(fecha_inicio); ERROR en lnea 1: ORA-12991: se hace referencia a la columna en una restriccin de multicolumna
[87]
el lenguaje SQL El error se debe a que no es posible borrar una columna que forma parte de la definicin de una instruccin. La solucin es utilizar CASCADE CONSTRAINT elimina las restricciones en las que la columna a borrar estaba implicada: ALTER TABLE curso DROP(fecha_inicio) CASCADE CONSTRAINTS; Esta instruccin elimina la restriccin de tipo CHECK en la que apareca la fecha_inicio y as se puede eliminar la columna.
desactivar restricciones
A veces conviene temporalmente desactivar una restriccin para saltarse las reglas que impone. La sintaxis es: ALTER TABLE tabla DISABLE CONSTRAINT nombre [CASCADE] La opcin CASCADE hace que se desactiven tambin las restricciones dependientes de la que se desactiv.
activar restricciones
Anula la desactivacin. Formato: ALTER TABLE tabla ENABLE CONSTRAINT nombre [CASCADE] Slo se permite volver a activar si los valores de la tabla cumplen la restriccin que se activa. Si hubo desactivado en cascada, habr que activar cada restriccin individualmente.
mostrar restricciones
El trabajo con restricciones ya se ha visto que es complejo. Por eso todas las bases de datos suelen proporcionar una vista (o ms) del diccionario de datos que permite consultar las restricciones. En el caso de Oracle, se puede utilizar la vista del diccionario de datos USER_CONSTRAINTS. Esta vista permite identificar las restricciones colocadas por el usuario (ALL_CONSTRAINTS permite mostrar las restricciones de todos los usuarios, pero slo est permitida a los administradores). En esa vista aparece toda la informacin que el diccionario de datos posee sobre las restricciones. En ella tenemos las siguientes columnas interesantes:
Columna
OWNER
Tipo de datos
VARCHAR2(20)
Descripcin
Indica el nombre del usuario propietario de la tabla [88]
Columna
CONSTRAINT_NAME CONSTRAINT_TYPE
Tipo de datos
VARCHAR2(30) VARCHAR2(1)
Descripcin
Nombre de la restriccin Tipo de restriccin: C. De tipo CHECK o NOT NULL P. PRIMARY KEY R. FOREIGN KEY
TABLE_NAME
VARCHAR2(30)
En el diccionario de datos hay otra vista que proporciona informacin sobre restricciones, se trata de USER_CONS_COLUMNS, en dicha tabla se muestra informacin sobre las columnas que participan en una restriccin. As si hemos definido una clave primaria formada por los campos uno y dos, en la tabla USER_CONS_COLUMNS aparecern dos entradas, una para el primer campo del ndice y otra para el segundo. Se indicar adems el orden de aparicin en la restriccin. Ejemplo (resultado de la instruccin SELECT * FROM USER_CONS_COLUMNS):
OWNER JORGE JORGE JORGE JORGE JORGE JORGE JORGE CONSTRAINT_NAME EXIS_PK EXIS_PK EXIS_PK PIEZA_FK PIEZA_FK PIEZA_PK PIEZA_PK TABLE_NAME EXISTENCIAS EXISTENCIAS EXISTENCIAS EXISTENCIAS EXISTENCIAS PIEZA PIEZA COLUMN_NAME TIPO MODELO N_ALMACEN TIPO MODELO TIPO MODELO POSITION 1 2 3 1 2 1 2
En esta tabla USER_CONS_COLUMNS aparece una restriccin de clave primaria sobre la tabla existencias, esta clave est formada por las columnas (tipo, modelo y n_almacen) y en ese orden. Una segunda restriccin llamada pieza_fk est compuesta por tipo y modelo de la tabla existencias. Finalmente la restriccin pieza_pk est formada por tipo y modelo, columnas de la tabla pieza. Para saber de qu tipo son esas restricciones, habra que acudir a la vista USER_CONSTRAINTS.
[89]