HIBERNATE
HIBERNATE
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Introducción
En este tema veremos clases mapeadas y optimización de mapeo asociados así como de qué manera
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
1 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Objetivos
es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
ca
campusvirtual.cualifica2.es
2 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Mapa Conceptual
[[[Elemento Multimedia]]]
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
3 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Introducción a Hibernate.
Hibernate es una herramienta ORM (Object-Relational mapping) para plataformas en Java que
facilita el mapeo de atributos entre una base de datos relacional (MySQL, PostgreSQL, …) y el
modelo de objetos de una aplicación, esto se puede hacer mediante archivos XML o por medio de
Características
es
2.
ca
lifi
ua
l.c
ua
rt
La programación orientada a objetos y las bases de datos relacionales son dos paradigmas
diferentes, el modelo relacional trata con relaciones, tuplas y conjuntos, sin embargo la
pu
programación orientada a objetos trata con objetos, atributos y relaciones entre estos.
m
Si estamos usando objetos en nuestra aplicación y queremos que sean persistentes normalmente
ca
abriremos una conexión JDBC, crearemos una sentencia SQL y copiaremos todos los valores en la
cadena SQL que estemos construyendo, esto se complica cuando el objeto tiene muchas
propiedades, asociaciones o contiene otros objetos dentro del mismo objeto a persistir. Es por eso
que surge la necesidad de usar un ORM que nos ayudará a evitar estos problemas o diferencias
Con un buen ORM, solo tendremos que definir la forma en la que establecemos la
correspondencia entre las clases y las tablas una sola vez, como indicar que propiedad se
corresponde con que columna y que clase con que tabla. Hibernate nos proporciona además un
campusvirtual.cualifica2.es
4 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
lenguaje para el manejo de consultas a la base de datos llamado HQL, similar al SQL que se
utiliza para obtener objetos de la base de datos. La ventaja de usar este lenguaje, es que nos
Desde la versión 3.2.0, Hibernate desarrolla la especificación JPA, con lo que ahora es posible
desarrollar una capa de acceso a datos compatible con los estándares de Java en Hibernate, y
es
Esta API busca unificar la manera en que funcionan las utilidades que proveen un mapeo objeto-
relacional.
2.
El objetivo que persigue el diseño de esta API es no perder las ventajas de la orientación a objetos al
ca
interactuar con una base de datos, como sí pasaba con EJB2, y permitir usar objetos POJO. Por otro
lifi
lado, esta especificación tiene una desventaja, y es que estaremos perdiendo algunas características
campusvirtual.cualifica2.es
5 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Hibernate.
La razón de usar Hibernate reside en que cuando creamos una aplicación la mayoría de consultas
que se realizan son muy similares y siempre estamos copiando código por lo que se produce una
extensión innecesaria de la aplicación. Aquí es donde Hibernate propone juntar todas las
consultas y procesos para que ya estén hechos y solo tengamos que elegirlos de nuevo en vez de
volver a escribirlos. En definitiva Hibernate asigna clases Java a tablas de bases de datos y tipos de
datos Java a tipos de datos SQL y ahorra al desarrollador gran parte de las tareas de programación
es
relacionadas con la persistencia de datos comunes.
2.
Bases de datos soportadas
ca
Hibernate casi todos los RDBMS (Relational Database Management System). A continuación se
lifi
muestra una lista con algunos soportados por Hibernate:
ua
HSQL
l.c
DB2/NT
MySQL
ua
PostgreSQL
rt
FrontBase
i
Oracle
sv
Tecnologías soportadas
XDoclet Spring
J2EE
Eclipse plug-ins
Maven
campusvirtual.cualifica2.es
6 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Hibernate utiliza varias API Java existentes, como JDBC, Java Transaction API (JTA) y Java Naming
and Directory Interface (JNDI). JDBC proporciona un nivel rudimentario de abstracción a las bases
de datos relacionales, lo que permite que casi cualquier base de datos con un controlador JDBC sea
compatible con Hibernate. JNDI y JTA permiten que Hibernate se integre con los servidores de
aplicaciones J2EE.
es
Arquitectura Hibernate
2.
En la siguiente imagen se muestra la arquitectura de Hibernate con algunas clases que son básicas
para su funcionamiento:
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
Objeto Configuration:
normalmente se crea sólo una vez durante la inicialización de la aplicación. Representa un archivo
componentes clave:
campusvirtual.cualifica2.es
7 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Objeto SessionFactory:
El objeto de configuración se utiliza para crear un objeto SessionFactory que inturn configura
es
objeto Session sea instanciado. SessionFactory es un objeto de seguridad de subproceso y utilizado
2.
SessionFactory que por lo general se crea durante el inicio de la aplicación y se mantiene para su
ca
uso posterior. Necesitarías un objeto SessionFactory por cada base de datos utilizando un archivo de
lifi
configuración independiente. Así que si se está utilizando varias bases de datos, entonces se tendría
Un objeto Session se utiliza para obtener una conexión física con una base de datos. El objeto
ua
Session es ligero y está diseñado para ser instanciado cada vez que se necesita una interacción con
rt
la base de datos. Los objetos persistentes se guardan y recuperan a través de un objeto Session.
i
sv
Los objetos Session no deben mantenerse abiertos durante mucho tiempo porque normalmente no
pu
son seguros para el hilo y deben crearse y destruirse según sea necesario.
Objeto Transaction:
m
ca
Una transacción representa una unidad de trabajo con la base de datos y la mayoría de RDBMS
pueden optar por no usar esta interfaz, en lugar de administrar las transacciones en su propio
código de aplicación.
Objeto Query:
Los objetos Query usan cadenas de texto SQL o HQL (Hibernate Query Language) para llevar a cabo
campusvirtual.cualifica2.es
8 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
consultas en la BD y crear objetos. Una instancia de Query se utiliza para vincular parámetros de
consulta, limitar el número de resultados devueltos por la consulta y finalmente para ejecutar la
consulta.
Objeto Criteria:
El objeto Criteria se utiliza para crear y ejecutar consultas de criterios orientadas a objetos para
recuperar objetos.
es
Configuración
2.
Hibernate está diseñado para funcionar con muchos entornos distintos, por lo tanto, existe una gran
ca
cantidad de parámetros de configuración. Normalmente, dichos parámetros se proporcionas con un
lifi
archivo de propiedades Java estándar denominado hibernate.properties o como un archivo XML
denominado hibernate.cfg.xml, ambos (no los dos al mismo tiempo) deben estar en el
ua
directorio raíz del classpath. La mayoría de las propiedades tienen valores predeterminados y no
l.c
es necesario especificarlos todos en el archivo de propiedades a menos que sea realmente necesario.
ua
.addClass(org.hibernate.auction.Bid.class)
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
pu
.setProperty("hibernate.order_updates", "true");
Un ejemplo de hibernate.cfg.xml:
m
ca
campusvirtual.cualifica2.es
9 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
En este ejemplo tenemos la configuración para el acceso a una base de datos MySQL, en la
etiqueta <mapping> que indica con un atributo resource un fichero XML que mapea una clase
es
mayoría de consultas que se realizan son muy similares y siempre estamos
copiando código por lo que se produce una extensión innecesaria de la aplicación.
2.
Verdadero.
ca
Falso.
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
10 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Clases Mapeadas.
Las clases Java cuyos objetos o instancias se guardan en la base de datos se denominan clases
persistentes en Hibernate. Hibernate funciona mejor si estas clases siguen algunas reglas
simples, también conocido como POJO (Plain Old Java Object). Existen las siguientes reglas
principales de las clases persistentes, sin embargo, ninguna de estas reglas son difíciles de cumplir.
es
Todas las clases deben definir un ID para permitir la fácil identificación de los objetos dentro
2.
de Hibernate y la base de datos. Esta propiedad se relaciona con la clave primaria de una tabla.
ca
Todos los atributos que se almacenarán en la base de datos deben declararse privados y tener
lifi
Una característica central de Hibernate, proxies, depende de que la clase persistente sea no
ua
final, o que implemente una interfaz que declara todos los métodos públicos.
Todas las clases no deben implementar clases o interfaces especializadas requeridas por el
l.c
framework EJB.
ua
Para el mapeo de clases a tablas tenemos dos opciones para definirlas, mediante ficheros xml o con
rt
Por ejemplo partimos de la siguiente clase POJO, debemos recordar que es imprescindible tener un
pu
public Person() {}
public Person(String name, String lname, String address) {
this.firstName = name;
this.name = lname;
this.address = address;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
campusvirtual.cualifica2.es
11 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
es
}
public void setAddress( String addr ) {
this.address = addr;
2.
}
}
ca
Con POJO enfatizamos que el objeto debe ser ordinario, no un objeto particular, en especial un
lifi
JavaBean. ua
Para los ficheros xml que mapean clases se deben nombrar con el formato <nombre de la
l.c
clase>.hbm.xml:
ua
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
i
sv
<hibernate-mapping>
<class name="Person" table="PERSON">
<meta attribute="class-description">
pu
<generator class="native"/>
</id>
ca
La ruta a este fichero de mapeado debe estar definido en la configuración de Hibernate mediante la
El fichero de mapeo es un documento XML que tiene < hibernate-mapping > como raíz
campusvirtual.cualifica2.es
12 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
<hibernate-mapping> que contiene todos los elementos <class>< class >.< / class >
< hibernate-mapping >< class >Los elementos <class> < class >se utilizan para definir
asignaciones específicas de una clase Java a las tablas en la base de datos. El nombre de la
clase Java se especifica mediante el atributo name del elemento de clase y el nombre de la
< hibernate-mapping >< class >< class >El elemento <meta> es opcional y se puede usar
< hibernate-mapping >< class >< class ><id>< id > asigna el atributo ID único en la clase a
es
la clave primaria de la tabla. El atributo name del elemento id se refiere a la propiedad en la
2.
clase y el atributo column se refiere a la columna de la tabla. El atributo type contiene el tipo
ca
de dato, el dato se convertirá de Java a SQL y viceversa.< / class >
< hibernate-mapping >< class >< class >< id >El elemento <generator> < generator
lifi
>dentro del elemento id se utiliza para generar automáticamente la clave primaria.
ua
< hibernate-mapping >< class >< class >< id >< generator >El elemento <property> <
property >se utiliza para asignar una propiedad de clase Java a una columna de la tabla. El
l.c
atributo name del elemento se refiere a la propiedad en la clase y el atributo column se refiere
ua
Anotaciones
m
Hasta ahora hemos visto cómo definir el mapeo de clases a tablas mediante documentos xml, pero
ca
Las anotaciones de Hibernate son la forma más reciente de definir asignaciones sin un uso de
archivo XML. Se pueden utilizar anotaciones como añadido o como reemplazo de metadatos de
mapeo en XML. Hibernate Annotations es un potente método para proporcionar los metadatos sobe
mapeo de objetos y tablas relacionales. Todos los metadatos se agregan a la clase POJO junto con el
durante el desarrollo. Si va a hacer una aplicación portable para otras aplicaciones ORM
compatibles con EJB 3, se deben utilizar anotaciones, pero si es mas importante la flexibilidad se
campusvirtual.cualifica2.es
13 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
import javax.persistence.*;
@Entity
@Table(name = "PERSONA")
public class Person {
@Id @GeneratedValue
@Column(name = "id")
private int id;
es
@Column(name = "name")
private String name;
@Column(name = "last_name")
2.
private String lastName;
@Column(name = "address")
ca
private String address;
public Person() {}
lifi
public Person(String name, String lname, String address) {
this.firstName = name;
this.name = lname;
ua
this.address = address;
}
public int getId() {
l.c
return id;
}
ua
}
sv
}
public String getAddress() {
return address;
}
public void setAddress( String addr ) {
this.address = addr;
}
}
Las anotaciones estándar de EJB 3 están en el paquete javax.persistence, por lo que importamos
este paquete como el primer paso. También podemos observar el uso de las anotaciones @Column
sobre las propiedades, si quisiéramos el acceso a través de getters bastaría con ponerlos sobre ellos
campusvirtual.cualifica2.es
14 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
pero debemos elegir si todos son sobre getters o propiedades, no podemos tener algunos con
@Entity: con la anotación @Entity marcamos una clase como un bean de entidad, por lo que debe
tener un constructor sin argumentos que sea visible con al menos el ámbito protegido.
@Table: la anotación @Table permite especificar los detalles de la tabla que se utilizará para
persistir la entidad en la base de datos. Proporciona cuatro atributos, que permiten anular el nombre
es
de la tabla, su catálogo y su esquema, y también permite aplicar restricciones únicas en las
columnas de la tabla.
2.
@Id y @GeneratedValue: cada bean de entidad tendrá una clave primaria, se asignará con la
ca
anotación @Id. La clave primaria puede ser un solo campo o una combinación de varios campos
lifi
dependiendo de la estructura de la tabla. De forma predeterminada, la anotación @Id determinará
estrategia y un generador. Sin embargo, dejar que Hibernate determine qué tipo de generador
utilizar permite que el código sea más portable entre diferentes bases de datos.
ua
@Column: la anotación @Column se utiliza para especificar los detalles de la columna a la que se
rt
asignará un campo o una propiedad. Puede utilizar la anotación de columna con los siguientes
i
sv
-length permite el tamaño de la columna utilizada para asignar un valor en particular para un valor
ca
String.
-nullable permite que la columna se marque NOT NULL cuando se genera el esquema.
-unique provoca que la columna se marque que contiene solo valores únicos.
campusvirtual.cualifica2.es
15 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
El lenguaje utilizado para llevar a cabo consultas con Hibernate se llama HQL o Hibernate Query
Para la realización de consultas se utiliza la clase Query. Esta nos permite introducir en su método
es
2.
De esta forma obtenemos el objeto query con el conjunto de resultados directamente para trabajar
ca
con ellos.
lifi
Ahora vamos a listar el conjunto de estos resultados mediante la función list().
ua
l.c
Ya tenemos en una lista los resultados ahora vamos a verlos por pantalla recorriendo esta lista.
ua
irt
sv
pu
m
ca
Así es como trabaja Hibernate, con 5 líneas de código hemos obtenido un conjunto de resultados y
los hemos mostrado por pantalla. Al igual que hemos hecho con una lista de registros String,
podemos realizarlo con objetos y con cualquier tipo que haya en la base de datos.
También se puede utilizar sentencias SQL directamente con Hibernate a través de Native SQL, sin
portabilidad a otras bases de datos, y también para aprovechar las estrategias de Hibernate para la
cache.
campusvirtual.cualifica2.es
16 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
En HQL palabras clave como SELECT, FROM, WHERE etc. no son sensibles a mayúsculas pero
También podemos usar el nombre completo de una clase, es decir incluyendo la jerarquía de
es
Podemos asignar alias con la palabra AS:
2.
String hql = "FROM Employee AS E";
ca
Query query = session.createQuery(hql);
lifi
List results = query.list(); ua
También se puede obviar y poner el alias directamente después del nombre:
l.c
tabla.
pu
La cláusula WHERE, como en SQL nos permite definir condiciones en la selección, las
campusvirtual.cualifica2.es
17 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
"GROUP BY E.firstName";
es
Con DELETE para eliminar registros en base a una selección, como se puede observar estamos
2.
definiendo un parámetro con setParameter(<nombre parámetro>, <valor>), en el string de la
ca
lifi
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
ua
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
l.c
Un detalle importante es que para la paginación tenemos dos funciones de la clase Query,
limit, ambas funciones devuelven el propio objeto query por lo que se pueden utilizar concatenadas
en la misma línea.
campusvirtual.cualifica2.es
18 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
query.setFirstResult(1);
query.setMaxResults(10);
es
Sintaxis de ALTER DATABASE
2.
ALTER {DATABASE | SCHEMA} [db_name]
ca
alter_specification [, alter_specification] ...
lifi
alter_specification:
ua
[DEFAULT] CHARACTER SET charset_name
l.c
ALTER DATABASE le permite cambiar las características globales de una base de datos. Estas
rt
La cláusula CHARACTER SET cambia el conjunto de caracteres por defecto de la base de datos. La
pu
En MySQL 5.0, el nombre de base de datos puede omitirse. El comando se aplica a la base de datos
ca
alter_specification:
campusvirtual.cualifica2.es
19 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
es
| ADD [CONSTRAINT [symbol]]
2.
UNIQUE [index_name] [index_type] (index_col_name,...)
ca
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)
[reference_definition]
ua
[FIRST|AFTER col_name]
pu
| DISABLE KEYS
| ENABLE KEYS
campusvirtual.cualifica2.es
20 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
| ORDER BY col_name
| DISCARD TABLESPACE
es
| IMPORT TABLESPACE
2.
| table_options
ca
ALTER TABLE le permite cambiar la estructura de una tabla existente. Por ejemplo, puede añadir o
lifi
borrar columnas, crear o destruir índices, cambiar el tipo de columnas existentes, o renombrar
ua
columnas o la misma tabla. Puede cambiar el comentario de la tabla y su tipo.
l.c
La sintaxis para varias de las alteraciones permitidas es similar a cláusulas del comando CREATE
TABLE. Esto incluye modificaciones table_options , para opciones tales como ENGINE,
ua
AUTO_INCREMENT, y AVG_ROW_LENGTH.
rt
Algunas operaciones pueden producir advertencias si se intentan en una tabla para que el motor de
i
sv
WARNINGS.
pu
Si usa ALTER TABLE para cambiar la especificación de una columna pero DESCRIBE tbl_name
m
indica que la columna no ha cambiado, es posible que MySQL haya ignorado las modificaciones por
ca
alguna de las razones “Cambios tácitos en la especificación de columnas”. Por ejemplo, si intenta
cambiar una columna VARCHAR a CHAR, MySQL usa VARCHAR si la tabla contiene otras columnas
de longitud variable.
ALTER TABLE funciona creando una copia temporal de la tabla original. La alteración se realiza en
la copia, luego la tabla original se borra y se renombra la nueva. Mientras se ejecuta ALTER TABLE
la tabla original es legible por otros clientes. Las actualizaciones y escrituras en la tabla se esperan
hasta que la nueva tabla esté lista, luego se redirigen automáticamente a la nueva tabla sin ninguna
actualización fallida.
campusvirtual.cualifica2.es
21 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Tenga en cuenta que si usa cualquier otra opción en ALTER TABLE distinta a RENAME, MySQL
siempre crea una tabla temporal, incluso si los datos no necesitan ser copiados (tales como cuando
cambia el nombre de una columna). Planeamos arreglar esto en el futuro, pero debido a que ALTER
TABLE no es un comando que se use frecuentemente, no es un tema demasiado urgente. Para tablas
MyISAM puede incrementar la velocidad de la operación de recrear índices (que es la parte más
un valor alto.
es
- Para usar ALTER TABLE, necesita ALTER, INSERT, y permisos CREATE para la tabla.
2.
- IGNORE es una extensión MySQL a SQL estándar. Controla cómo funciona ALTER TABLE si hay
ca
duplicados en las claves primarias en la nueva tabla o si ocurren advertencias cuando está activo el
modo STRICT. Si no se especifica IGNORE la copia se aborta y no se ejecuta si hay errores de clave
lifi
duplicada. Si se especifica IGNORE , entonces para duplicados con clave única, solo se usa el primer
ua
registro. El resto de registros conflictivos se borran. Los valores erróneos se truncan al valor más
cercano aceptable.
l.c
- Puede ejecutar múltiples cláusulas ADD, ALTER, DROP, y CHANGE en un único comando ALTER
ua
TABLE . Esta es una extensión MySQL al estándar SQL, que permite solo una de cada cláusula por
rt
comando ALTER TABLE . Por ejemplo, para borrar múltiples columnas en un único comando:
i
sv
- CHANGE col_name, DROP col_name,y DROP INDEX son extensiones MySQL al estándar SQL.
m
- Si usa ALTER TABLE tbl_name RENAME TO new_tbl_name sin ninguna otra opción, MySQL
crear una tabla temporal. (Puede usar el comando RENAME TABLE para renombrar tablas.
- Las cláusulas column_definition usan la misma sintaxis para ADD y CHANGE así como CREATE
TABLE. Tenga en cuenta que esta sintaxis incluye el nombre de la columna, no solo el tipo.
campusvirtual.cualifica2.es
22 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
- Puede renombrar una columna usando CHANGE old_col_name column_definition. Para ello,
especifique el nombre de columna viejo y nuevo y el tipo de la columna actual. Por ejemplo, para
Si quiere cambiar el tipo de una columna pero no el nombre, la sintaxis CHANGE necesita un
es
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
2.
Puede usar MODIFY para cambiar el tipo de una columna sin renombrarla:
ca
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
lifi
- Si usa CHANGE o MODIFY para acortar una columna para la que existe un índice en la columna, y
ua
la longitud de la columna resultante es menor que la del índice, MySQL reduce el índice
automáticamente.
l.c
ua
- Cuando cambia un tipo de columna usando CHANGE o MODIFY, MySQL intenta convertir valores
- En MySQL 5.0, puede usar FIRST o AFTER col_name para añadir una columna a una posición
i
sv
específica sin un registro de tabla. Por defecto se añade al final. Puede usar FIRST y AFTER en
pu
- ALTER COLUMN especifica un nuevo valor por defecto para una columna o borra el antiguo valor
por defecto. Si el antiguo valor por defecto se borra y la columna puede ser NULL, el nuevo valor
ca
por defecto es NULL. Si la columna no puede ser NULL, MySQL asigna un valor por defecto.
- Si las columnas se borran de una tabla, las columnas también se borran de cualquier índice del que
formaran parte. Si todas las columnas que crean un índice se borran, también se borra el índice.
- Si una tabla contiene solo una columna, la columna no puede borrarse. Si lo que quiere es borrar la
campusvirtual.cualifica2.es
23 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
- DROP PRIMARY KEY borra el índice primario. Nota: En versiones anteriores de MySQL, si no
existe clave primaria, entonces DROP PRIMARY KEY borraría el primer índice UNIQUE de la tabla.
Esto ya no es así en MySQL 5.0, cuando trata de usar DROP PRIMARY KEY en una tabla sin clave
- Si añade UNIQUE INDEX o PRIMARY KEY a una tabla, se almacena antes que cualquier índice no
único para que MySQL pueda detectar claves duplicadas tan rápido como sea posible.
es
- Si usa ALTER TABLE en una tabla MyISAM , todos los índices no únicos se crean en un batch
separado (como para REPAIR TABLE). Esto debe hacer ALTER TABLE mucho más rápido cuando
2.
tiene muchos índices.
ca
En MySQL 5.0, esta característica puede activarse explícitamente ALTER TABLE ... DISABLE KEYS
lifi
le dice a MySQL que pare de actualizar índices no únicos para una tabla MyISAM . ALTER TABLE ...
ENABLE KEYS debe usarse para recrear índices perdidos. MySQL lo hace con un algoritmo especial
ua
que es mucho más rápido que insertar claves una a una, así que deshabilitar claves antes de realizar
l.c
operaciones de inserción masivas debería dar una mejora de velocidad. Usar ALTER TABLE ...
DISABLE KEYS requiere del permiso INDEX además de los permisos mencionados anteriormente.
ua
- Las cláusulas FOREIGN KEY y REFERENCES son soportadas por el motor InnoDB, que implementa
rt
ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...). Para otros motores de
i
sv
almacenamiento, las cláusulas se parsean pero se ignoran. La cláusula CHECK se par- sea pero se
ignora por todos los motores de almacenamiento. La razón para aceptar pero ignorar las cláusulas
pu
es para compatibilidad, para hacer más fácil portar código de otros servidores SQL, y para ejecutar
m
- En MySQL 5.0, InnoDB soporta el uso de ALTER TABLE para borrar claves foráneas:
Si quiere cambiar el conjunto de caracteres por defecto de la tabla y todas las columnas de
caracteres (CHAR, VARCHAR, TEXT) a un nuevo conjunto de caracteres, use un comando como:
campusvirtual.cualifica2.es
24 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Atención: La operación precedente convierte los valores de columnas entre conjuntos de caracteres.
Esto no es lo que quiere hacer si tiene una columna en un conjunto de caracteres (como latin1) pero
los valores almacenados realmente usan otro conjunto de caracteres incompatible (como utf8). En
este caso, tiene que hacer lo siguiente para cada una de tales columnas:
es
La razón de que esto funcione es que no hay conversión cuando convierte desde o hacia columnas
2.
BLOB.
ca
Si especifica CONVERT TO CHARACTER SET binary, las columnas CHAR, VARCHAR, y TEXT se
lifi
convierten a sus cadenas de caracteres binarias (BINARY, VARBINARY, BLOB). Esto significa que
Para solo cambiar el conjunto de caracteres por defecto de una tabla, use este comando:
ua
especifica uno para una nueva columna que añada a la tabla (por ejemplo, con ALTER TABLE ... ADD
column).
pu
Atención: En MySQL 5.0, ALTER TABLE ... DEFAULT CHARACTER SET y ALTER TABLE ...
m
CHARACTER SET son equivalentes y cambian solo el conjunto de caracteres por defecto de la tabla.
ca
- Para una tabla InnoDB creada con su propio espacio de tablas en un fichero .ibd, este fichero
puede descartarse e importarse. Para descartar el fichero .ibd, use este comando:
Esto borra el fichero .ibd actual, así que asegúrese que tiene primero una copia de seguridad. Tratar
Para importar el fichero .ibd de la copia de seguridad de nuevo a la tabla, cópielo en el directorio de
campusvirtual.cualifica2.es
25 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
(cuando se usa IGNORE ) cuántos registros se borraron debido a duplicación de valores de claves
única.
Hay algunos ejemplos que muestran usos de ALTER TABLE. Comienza con una tabla t1 que se crea
es
como se muestra:
2.
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
ca
Para renombrar la tabla de t1 a t2:
lifi
mysql> ALTER TABLE t1 RENAME t2;
ua
Para cambiar la columna a desde INTEGER a TINYINT NOT NULL (dejando el mismo nombre), y
l.c
campusvirtual.cualifica2.es
26 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Tenga en cuenta que indexamos c (como PRIMARY KEY), ya que las columnas AUTO_INCREMENT
deben indexarse, y también que declaramos c como NOT NULL, ya que las columnas de clave
Cuando añade una columna AUTO_INCREMENT los valores se rellenan con números secuenciales
automáticamente. Para tablas MyISAM puede asignar el primer número de secuencia ejecutando
AUTO_INCREMENT=value.
es
Desde MySQL 5.0.3, puede usar la opción de tabla ALTER TABLE ... AUTO_INCREMENT=value para
2.
InnoDB para asignar el número de secuencia de nuevos registros si el valor es mayor que el máximo
ca
valor en la columna AUTO_INCREMENT. Si el valor es menor que el máximo actual en la columna,
lifi
Con tablas MyISAM, si no cambia la columna AUTO_INCREMENT, el número de secuencia no se ve
ua
afectado. Si elimina una columna AUTO_INCREMENT y luego añade otra columna
l.c
create_specification:
m
CREATE DATABASE crea una base de datos con el nombre dado. Para usar CREATE DATABASE,
En MySQL 5.0, las opciones create_specification pueden darse para especificar característica de la
campusvirtual.cualifica2.es
27 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
datos. La cláusula CHARACTER SET especifica el conjunto de caracteres por defecto de la base de
Las bases de datos en MySQL se implementan como directorios que contienen ficheros que se
corresponden a tablas en la base de datos. Como no hay tablas en la base de datos cuando se crean
inicialmente, el comando CREATE DATABASE en MySQL 5.0 crea solo un directorio bajo el
es
Si crea manualmente un directorio bajo el directorio de datos (por ejemplo, con mkdir), el servidor lo
2.
CREATE SCHEMA puede usarse desde MySQL 5.0.2.
ca
lifi
También puede usar el programa mysqladmin para crear bases de datos.
ua
CREATE INDEX
[USING index_type]
rt
ON tbl_name (index_col_name,...)
i
sv
index_col_name:
pu
En MySQL 5.0, CREATE INDEX se mapea a un comando ALTER TABLE para crear índices.
ca
Normalmente, crea todos los índices en una tabla cuando se crea la propia tabla con CREATE
TABLE.
Una lista de columnas de la forma (col1,col2,...) crea un índice de múltiples columnas. Los valores de
Para columnas CHAR y VARCHAR, los índices pueden crearse para que usen solo parte de una
columna, usando col_name (length) para indexar un prefijo consistente en los primeros length
campusvirtual.cualifica2.es
28 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
El comando mostrado aquí crea un índice usando los primeros 10 caracteres de la columna name:
Como la mayoría de nombres usualmente difieren en los primeros 10 caracteres, este índice no
debería ser mucho más lento que un índice creado con la columna name entera. Además, usar
columnas parcialmente para índices puede hacer un fichero índice mucho menor, que puede ahorrar
es
mucho espacio de disco y además acelerar las operaciones INSERT.
2.
Los prefijos pueden tener una longitud de hasta 255 bytes. Para tablas MyISAM y InnoDB en MySQL
ca
5.0, pueden tener una longitud de hasta 1000 bytes . Tenga en cuenta que los límites de los prefijos
lifi
se miden en bytes, mientras que la longitud de prefijo en comandos CREATE INDEX se interpreta
como el número de caracteres. Tenga esto en cuenta cuando especifique una longitud de prefijo
ua
para una columna que use un conjunto de caracteres de múltiples bytes.
l.c
Una especificación index_col_name puede acabar con ASC o DESC. Estas palabras se permiten para
Actualmente se parsean pero se ignoran; los valores de índice siempre se almacenan en orden
rt
ascendente.
i
sv
En MySQL 5.0, algunos motores le permiten especificar un tipo de índice cuando se crea un índice.
pu
La sintaxis para el especifica- dor index_type es USING type_name. Los valores type_name posibles
soportados por distintos motores se muestran en la siguiente tabla. Donde se muestran múltiples
m
Ejemplo:
campusvirtual.cualifica2.es
29 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
TYPE type_name puede usarse como sinónimo de USING type_name para especificar un tipo de
índice. Sin embargo, USING es la forma preferida. Además, el nombre de índice que precede el tipo
de índice en la especificación de la sintaxis de índice no es opcional con TYPE. Esto es debido a que,
en contra de USING, TYPE no es una palabra reservada y se interpreta como nombre de índice.
Si especifica un tipo de índice que no es legal para un motor de almacenamiento, pero hay otro tipo
es
de índice disponible que puede usar el motor sin afectar los resultados de la consulta, el motor usa
el tipo disponible.
2.
Índices FULLTEXT en MySQL 5.0 puede indexar solo columnas CHAR, VARCHAR, y TEXT, y solo en
ca
tablas MyISAM .
lifi
Índices SPATIAL en MySQL 5.0 puede indexar solo columnas espaciales, y solo en tablas MyISAM.
ua
Sintaxis de CREATE TABLE
l.c
[(create_definition,...)]
rt
[table_options] [select_statement]
i
sv
O:
pu
m
ca
campusvirtual.cualifica2.es
30 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
31 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
es
2.
ca
lifi
ua
l.c
ua
rt
CREATE TABLE crea una tabla con el nombre dado. Debe tener el permiso CREATE para la tabla.
i
sv
Por defecto, la tabla se crea en la base de datos actual. Ocurre un error si la tabla existe, si no hay
pu
En MySQL 5.0, el nombre de tabla puede especificarse como db_name.tbl_name para crear la tabla
ca
en la base de datos específica. Esto funciona haya una base de datos actual o no. Si usa
identificadores entre comillas, entrecomille el nombre de base de datos y de tabla por separado. Por
Puede usar la palabra TEMPORARY al crear una tabla. Una tabla TEMPORARY es visible solo para la
conexión actual, y se borra automáticamente cuando la conexión se cierra. Esto significa que dos
conexiones distintas pueden usar el mismo nombre de tabla temporal sin entrar en conflicto entre
ellas ni con tablas no TEMPORARY con el mismo nombre. (La tabla existente se oculta hasta que se
borra la tabla temporal.) En MySQL 5.0, debe tener el permiso CREATE TEMPORARY TABLES para
campusvirtual.cualifica2.es
32 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
MySQL 5.0 soporta las palabras IF NOT EXISTS para que no ocurra un error si la tabla existe. Tenga
en cuenta que no hay verificación que la tabla existente tenga una estructura idéntica a la indicada
por el comando CREATE TABLE . Nota: Si usa IF NOT EXISTS en un comando CREATE TABLE ...
SELECT, cualquier registro seleccionado por la parte SELECT se inserta si la tabla existe o no.
MySQL representa cada tabla mediante un fichero .frm de formato de tabla (definición) en el
es
directorio de base de datos. El motor para la tabla puede crear otros ficheros también. En el caso de
tablas MyISAM , el motor crea ficheros índice y de datos. Por lo tanto, para cada tabla MyISAM
2.
tbl_name, hay tres ficheros de disco:
ca
lifi
ua
l.c
Una columna entera puede tener el atributo adicional AUTO_INCREMENT. Cuando inserta un valor
ua
asigna al siguiente valor de secuencia. Típicamente esto es value+1, donde value es el mayor valor
i
columnas deben definirse como uno de los tipos enteros , “Panorámica de tipos numéricos”. (El valor
pu
1.0 no es un entero.)
m
Nota: Solo puede haber una columna AUTO_INCREMENT por tabla, debe estar indexada, y no puede
contiene solo valores positivos. Insertar un número negativo se trata como insertar un número
positivo muy grande. Esto se hace para evitar problemas de precisión cuando los números
campusvirtual.cualifica2.es
33 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Para tablas MyISAM y BDB, puede especificar una columna AUTO_INCREMENT secundaria en una
Para hacer MySQL compatible con otras aplicaciones ODBC, puede encontrar el valor
- En MySQL 5.0, las definiciones de columnas de caracteres puede incluir un atributo CHARACTER
es
SET para especificar el conjunto de caracteres y, opcionalmente, una colación para la columna.
2.
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ca
- MySQL 5.0 interpreta las especificaciones de longitud en definiciones de columna en caracteres.
lifi
(Algunas versiones anteriores los interpretan en bytes.)
ua
- La cláusula DEFAULT especifica el valor por defecto para una columna. Con una excepción, el
valor por defecto debe ser constante; no puede ser una función o una expresión. Esto significa , por
l.c
ejemplo, que no puede poner como valor por defecto de una columna el valor de una función como
ua
Antes de MySQL 5.0.2, si una definición de columna no incluye valor DEFAULT explícito, MySQL
Si la columna puede tener valores NULL, la columna se define como una cláusula DEFAULT NULL
m
explícita.
ca
Si la columna no puede tener valores NULL, MySQL define la columna con una cláusula DEFAULT
explícita, usando el valor por defecto implícito para el tipo de datos de la columna. Los valores por
- Para tipos numéricos distintos a los declarados con el atributo AUTO_INCREMENT, por defecto es
0. Para una columna AUTO_INCREMENT, el valor por defecto es el siguiente valor de la secuencia.
- Para tipos de fecha y hora distintos a TIMESTAMP, el valor por defecto es el valor “cero” apropiado
para el tipo. Para la primera columna TIMESTAMP en una tabla, el valor por defecto es la fecha
campusvirtual.cualifica2.es
34 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
actual y la hora.
- Para tipos de cadenas distintos a ENUM, el valor por defecto es la cadena vacía. Para ENUM, el
Desde MySQL 5.0.2, si una definición de columna no incluye valor DEFAULT explícito , MySQL
es
Si la columna puede tener NULL como valor, la columna se define con una cláusula DEFAULT NULL
2.
explícita. Esto es lo mismo que antes de 5.0.2.
ca
Si la columna no puede tener valores NULL, MySQL define la columna sin cláusula DEFAULT
lifi
explícita. Para entradas de datos, si un comando INSERT o REPLACE no incluye valor para la
ua
columna, MySQL trata la columna según el modo SQL activo en ese momento:
Si el modo estricto no está activado, MySQL pone en la columna el valor por defecto implícito para el
l.c
Si está activo el modo estricto, ocurre un error para tablas transaccionales y el comando se deshace.
rt
Para tablas no transaccionales, ocurre un error, pero si esto ocurre para el segundo registro o
i
sv
En este caso, i no tiene valor explícito, así que en modo estricto todos los siguientes comandos
producen un error en modo estricto y no se inserta ningún registro. Para modo no estricto, solo el
tercer comando produce un error; el valor implícito por defecto se inserta para las dos primeras,
campusvirtual.cualifica2.es
35 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Para una tabla dada, puede usar el comando SHOW CREATE TABLE para ver qué columnas puede
Un comentario para una columna puede especificarse en MySQL 5.0 con la opción COMMENT . El
comentario se muestra con los comandos SHOW CREATE TABLE y SHOW FULL COLUMNS.
En MySQL 5.0, el atributo SERIAL puede usarse como un alias para BIGINT UNSIGNED NOT NULL
AUTO_INCREMENT UNIQUE.
es
KEY normalmente es sinónimo para INDEX. En MySQL 5.0, el atributo clave PRIMARY KEY puede
2.
especificarse como KEY cuando se da en una definición de columna. Esto se implementó por
ca
lifi
En MySQL, un índice UNIQUE es uno en que todos los valores en el índice deben ser distintos.
Ocurre un error si intenta añadir un nuevo registro con una clave que coincida con un registro
ua
existente. La excepción es que una columna en el índice puede contener valores NULL, puede
contener valores NULL múltiples. Esta excepción no se aplica a tablas BDB , en las que una columna
l.c
Una PRIMARY KEY es una KEY única donde todas las columnas de la clave deben definirse como
rt
NOT NULL. Si no se declaran explícitamente como NOT NULL, MySQL las declara implícitamente (y
i
sin decirlo) . Una tabla puede tener sólo una PRIMARY KEY. Si no tiene una PRIMARY KEY y una
sv
aplicación pide una PRIMARY KEY en sus tablas, MySQL retorna el primer índice UNIQUE que no
pu
En la tabla creada, una PRIMARY KEY se guarda en primer lugar, seguida por todos los índices
ca
UNIQUE, y luego los índices no únicos. Esto ayuda al optimizador MySQL a priorizar qué índice usar
Una PRIMARY KEY puede ser un índice de múltiples columnas. Sin embargo, no puede crear un
índice de múltiples columnas usando el atributo de clave PRIMARY KEY en una especificación de
columna. Hacerlo sólo marca la columna como primaria. Debe usar una cláusula PRIMARY
Si un índice PRIMARY KEY o UNIQUE consiste sólo de una columna que tenga un tipo entero, puede
campusvirtual.cualifica2.es
36 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
En MySQL, el nombre de una PRIMARY KEY es PRIMARY. Para otros índices, si no asigna un
nombre, el índice tienen el mismo nombre que la primera columna indexada, con un sufijo opcional
(_2, _3, ...) para hacerlo único. Puede ver los nombres de índice para una tabla usando SHOW INDEX
FROM tbl_name.
es
índice al crear el índice.
2.
En MySQL 5.0, sólo los motores MyISAM, InnoDB, BDB, y MEMORY soporta índices en columnas
que pueden tener valores NULL . En otros casos, debe declarar columnas indexadas como NOT
ca
NULL u ocurre un error.
lifi
Con sintaxis col_name (length) en una especificación de índice, puede crear un índice que use sólo
ua
los primeros length
l.c
caracteres de una columna CHAR o VARCHAR. Indexar sólo un prefijo de valores de columna como
En MySQL 5.0, los motores MyISAM y InnoDB soportan indexación en columnas BLOB y TEXT. Al
rt
indexar columnas BLOB o TEXT debe especificar una longitud de prefijo para el índice. Por ejemplo:
i
sv
En MySQL 5.0, los prefijos pueden tener hasta 1000 bytes de longitud para tablas MyISAM y InnoDB
m
y 255 bytes para otros tipos de tabla. Tenga en cuenta que los límites de prefijo se miden en bytes,
ca
mientras que la longitud de prefijo en comandos CREATE TABLE se interpretan como el número de
caracteres. Asegúrese de tener esto en cuenta al especificar una longitud de prefijo para una
Una especificación index_col_name puede acabar con ASC o DESC. Estas palabras clave se permiten
campusvirtual.cualifica2.es
37 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Cuando usa ORDER BY o GROUP BY en una columna TEXT o BLOB en un SELECT, el servidor
ordena los valores usando solo el número inicial de bytes indicados por la variable de sistema
max_sort_length.
En MySQL 5.0, puede crear índices especiales FULLTEXT, que se usan para índices full-text. Solo
las tablas MyISAM soportan índices FULLTEXT . Pueden crearse solo desde columnas CHAR,
VARCHAR, y TEXT. La indexación siempre se hace sobre la columna entera; la indexación parcial no
es
En MySQL 5.0, puede crear índices SPATIAL en tipos de columna espaciales. Los tipos espaciales se
2.
soportan solo para tablas MyISAM y las columnas indexadas deben declararse como NOT NULL.
ca
Consulte Capítulo 18, Extensiones espaciales de MySQL.
lifi
En MySQL 5.0, las tablas InnoDB soportan el chequeo de restricciones de claves foráneas. Tenga en
cuenta que la sintaxis FOREIGN KEY en InnoDB es más restrictiva que la sintaxis presentada para el
ua
comando CREATE TABLE al inicio de esta sección: las columnas en la tabla referenciada debe
l.c
siempre nombrarse explícitamente. InnoDB soporta tanto acciones ON DELETE como ON UPDATE
en MySQL 5.0.
ua
Para otros motores de almacenamiento, MySQL Server parsea la sintaxis FOREIGN KEY y
rt
REFERENCES en comandos CREATE TABLE, pero no hace nada. La cláusula CHECK se parsea paro
i
sv
Para tablas MyISAM cada columna NULL ocupa un bit extra, redondeado al byte más próximo. La
row length = 1
delete_flages 1 para tables con formato de registro estático. Las tablas estáticas usan un bit en el
registro para un flag que indica si el registro se ha borrado. delete_flages 0 para tablas dinámicas ya
campusvirtual.cualifica2.es
38 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
La parte table_options de la sintaxis CREATE TABLE puede usarse desde MySQL 3.23.
Las opciones ENGINE y TYPE especifican el motor de almacenamiento para la tabla. ENGINE es el
nombre preferido para la opción en MySQL 5.0, y TYPE está obsoleto. El soporte para la palabra
es
TYPE usada en este contexto desaparecerá en MySQL 5.1.
2.
Las opciones ENGINE y TYPE pueden tener los siguientes valores:
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
Si un motor no está disponible, MySQL usa en su lugar MyISAM. Por ejemplo, si una definición de
tabla incluye la opción ENGI- NE=BDB pero el servidor MySQL no soporta tablas BDB , la tabla se
crea como MyISAM. Esto hace posible tener un entorno de replicación donde tiene tablas
velocidad). En MySQL 5.0, aparece una advertencia si la especificación del motor no es correcta.
campusvirtual.cualifica2.es
39 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Las otras opciones de tabla se usan para optimizar el comportamiento de la tabla. En la mayoría de
casos, no tiene que especificar ninguna de ellas. La opción funciona para todos los motores a no ser
AUTO_INCREMENT
El valor inicial para AUTO_INCREMENT para la tabla. En MySQL 5.0, solo funciona para tablas
MyISAM y MEMORY. También se soporta para InnoDB desde MySQL 5.0.3. Para inicializar el primer
es
valor de auto incremento para motores que no soporten esta opción, inserte un registro de prueba
con un valor que sea uno menor al deseado tras crear la tabla, y luego borre este registro.
2.
Para motores que soportan la opción de tabla AUTO_INCREMENT en comandos CREATE TABLE
ca
puede usar ALTER TABLE tbl_name AUTO_INCREMENT = n para resetear el valor
lifi
AUTO_INCREMENT . ua
AVG_ROW_LENGTH
l.c
Una aproximación de la longitud media de registro para su tabla. Necesita inicializarla solo para
Cuando crea una tabla MyISAM , MySQL usa el producto de las opciones MAX_ROWS y
rt
máximo para la tabla es 65,536TB de datos (4GB antes de MySQL 5.0.6). (Si su sistema operativo no
pu
soporta ficheros de este tamaño, los tamaños de fichero se restringen al límite del sistema
operativo.) Si quiere mantener bajos los tamaños de los punteros para que el índice sea pequeño y
m
rápido y no necesita realmente ficheros grandes, puede decrementar el tamaño de puntero por
ca
defecto mediante la variable de sistema myi- sam_data_pointer_size que se añadió en MySQL 4.1.2.
Si quiere que todas sus tablas sean capaces de crecer por encima del límite por defecto y quiere
mantener sus tablas ligeramente más lentas y más grandes de lo necesario, puede incrementar el
SET.
campusvirtual.cualifica2.es
40 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
COLLATE
CHECKSUM
Póngalo a 1 si quiere que MySQL mantenga un checksum para todos los registros (un checksum que
MySQL actualiza automáticamente según cambia la tabla). Esto hace que la tabla tenga
actualizaciones más lentas, pero hace más fácil encontrar tablas corruptas. El comando CHECKSUM
es
TABLE muestra el checksum (solo para MyISAM).
2.
COMMENT
ca
Un comentario para su tabla, hasta 60 caracteres.
lifi
MAX_ROWS
ua
Máximo número de registros que planea almacenar en la tabla. No es un límite absoluto, sino un
l.c
indicador que la tabla debe ser capaz de almacenar al menos estos registros.
ua
MIN_ROWS
rt
PACK_KEYS
pu
Ponga esta opción a 1 si quiere tener índices más pequeños. Esto hace normalmente que las
m
actualizaciones sean más lentas y las lecturas más rápidas. Poner esta opción a 0 deshabilita la
ca
compresión de claves. Ponerla a DEFAULT le dice al motor que comprima solo columnas
Si no usa PACK_KEYS, por defecto se comprimen solo cadenas, no números. Si usa PACK_KEYS = 1,
Cada clave necesita un byte extra para indicar cuántos bytes de la clave previa son los mismos para
la siguiente clave.
campusvirtual.cualifica2.es
41 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Esto significa que si tiene muchas claves iguales en dos registros consecutivos, todas las “mismas”
claves siguientes usualmente solo ocupan dos bytes (incluyendo el puntero al registro). Comparar
esto con el caso ordinario donde las siguiente claves ocupan storage_size_for_key + pointer_size
(donde el tamaño del puntero es usualmente 4). Obtiene un gran beneficio a partir de la compresión
de prefijos señalo si tiene muchos números que sean el mismo. Si todas las claves son totalmente
es
distintas, usa un byte más por clave, si la clave no es una clave que pueda tener valores NULL . (En
2.
ese caso, el tamaño empaquetado de la clave se almacena en el mismo byte que se usa para marcar
ca
PASSWORD
lifi
Cifra el fichero .frm con una contraseña. Esta opción no hace nada en la versión estándar de MySQL.
ua
DELAY_KEY_WRITE
l.c
Póngalo a 1 si quiere retardar actualizaciones de clave para la tabla hasta que la tabla se cierra (solo
ua
en MyISAM).
rt
ROW_FORMAT
i
sv
Define cómo deben almacenarse los registros. Actualmente esta opción solo funciona con tablas
pu
MyISAM. El valor de la opción puede ser FIXED o DYNAMIC para formato de longitud estática o
ROW_FORMAT=REDUNDANT.
RAID_TYPE
Tenga en cuenta que el soporte para RAID se ha eliminado desde MySQL 5.0.
UNION
campusvirtual.cualifica2.es
42 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
UNION se usa cuando quiere usar una colección de tablas idénticas como una. Funciona solo con
tablas MERGE.
En MySQL 5.0, debe tener permisos SELECT, UPDATE, y DELETE para las tablas mapeadas en una
tabla MERGE. (Nota: Originalmente, todas las tablas usadas tenían que estar en la misma base de
INSERT_METHOD
es
Si quiere insertar datos en una tabla MERGE debe especificarlo con INSERT_METHOD en la tabla
2.
en que se debe insertar el registro. INSERT_METHOD es una opción útil para tablas MERGE solo.
Use un valor de FIRST o LAST para que las inserciones vayan a la primera o última tabla, o un valor
ca
de NO para evitar inserciones.
lifi
DATA DIRECTORY, INDEX DIRECTORY
ua
Usando DATA DIRECTORY=' directory' o INDEX DIRECTORY=' directory' puede especificar dónde
l.c
debe el moto MyISAM guardar un fichero de datos e índice de una tabla. Tenga en cuenta que el
directorio debe ser una ruta completa al directorio (no una ruta relativa).
ua
Estas opciones solo funcionan cuando no usa la opción --skip-symbolic-links . Su sistema operativo
rt
En MySQL 5.0, puede crear una tabla de otra añadiendo un comando SELECT al final del comando
pu
CREATE TABLE :
m
MySQL crea nuevas columnas para todos los elementos en un SELECT. Por ejemplo:
Esto crea una tabla MyISAM con tres columnas, a, b, y c. Tenga en cuenta que las columnas para el
campusvirtual.cualifica2.es
43 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
siguiente ejemplo:
es
2.
ca
lifi
Para cada registro en la tabla foo, se inserta un registro en bar con los valores de foo y valores por
ua
defecto para las nuevas columnas:
Si hay cualquier error al copiar los datos a la tabla, se borra automáticamente y no se crea.
l.c
ua
CREATE TABLE ... SELECT no crea ningún índice automáticamente. Se hace a propósito para hacer
el comando lo más flexible posible. Si quiere tener índices en la tabla creada, debe especificarlo
rt
Al crear una tabla con CREATE ... SELECT, asegúrese de poner un alias para cualquier llamada a
función o expresión en la consulta. Si no lo hace, el comando CREATE puede fallar o crear nombres
de columnas no deseados.
campusvirtual.cualifica2.es
44 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
GROUP BY artist.id;
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
En MySQL 5.0, use LIKE para crear una tabla vacía basada en la definición de otra tabla, incluyendo
es
CREATE TABLE new_tbl LIKE orig_tbl;
2.
CREATE TABLE ... LIKE no copia ninguna opción de tabla DATA DIRECTORY o INDEX DIRECTORY
ca
especificadas en la tabla original, ni ninguna definición de clave foránea.
lifi
Puede preceder SELECT con IGNORE o REPLACE para indicar cómo tratar registros que dupliquen
claves únicas. Con IGNORE, los nuevos registros que duplican un registro único existente se
ua
descartan. Con REPLACE, los nuevos registros reemplazan a los antiguos con el mismo valor. Si ni
Para asegurar que el log de update o binario puede usarse para recrear tablas originales, MySQL no
DROP DATABASE borrar todas las tablas en la base de datos y borrar la base de datos. Sea muy
m
cuidadoso con este comando! Para usar DROP DATABASE, necesita el permiso DROP en la base de
ca
datos.
Si usa DROP DATABASE en una base de datos enlazada simbólicamente, tanto el enlace como la
DROP DATABASE retorna el número de tablas que se eliminan. Se corresponde con el número de
campusvirtual.cualifica2.es
45 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
El comando DROP DATABASE borrar del directorio de base de datos los ficheros y directorios que
es
Todos los subdirectorios con nombres que tienen dos dígitos hexadecimales 00-ff. Son subdirectorios
2.
usados por tablas RAID . (Estos directorios no se borran desde MySQL 5.0, cuando se eliminó el
soporte para tablas RAID . Debe convertir las tablas RAID y eliminar estos directorios manualmente
ca
antes de actualizar a MySQL 5.0.)
lifi
El fichero db.opt , si existe.
ua
Si permanecen otros ficheros o directorios en el directorio de la base de datos tras que MySQL borre
l.c
los ficheros listados, el directorio de base de datos no puede borrarse. En este caso, debe borrar
DROP INDEX borra el índice llamado index_name de la tabla tbl_name. En MySQL 5.0, DROP INDEX
[RESTRICT | CASCADE]
DROP TABLE borra una o más tablas. Debe tener el permiso DROP para cada tabla. Todos los datos
campusvirtual.cualifica2.es
46 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
de la definición de tabla son borrados, así que tenga cuidado con este comando.
Use IF EXISTS para evitar un error para tablas que no existan. Un NOTE se genera para cada tabla
RESTRICT y CASCADE se permiten para hacer la portabilidad más fácil. De momento, no hacen
nada.
Nota: DROP TABLE hace un commit automáticamente con la transacción activa, a no ser que use la
es
palabra TEMPORARY.
2.
La palabra TEMPORARY tiene el siguiente efecto:
ca
- El comando solo borra tablas TEMPORARY.
lifi
- El comando no acaba una transacción en marcha.
ua
- No se chequean derechos de acceso. (Una tabla TEMPORARY es visible solo para el cliente que la
l.c
Usar TEMPORARY es una buena forma de asegurar que no borra accidentalmente una tabla no
rt
TEMPORARY.
i
sv
La operación de renombrar se hace automáticamente, lo que significa que ningún otro flujo puede
acceder a ninguna de las tablas mientras se ejecuta el renombrado. Por ejemplo, si tiene una tabla
existente old_table, puede crear otra tabla new_table con la misma estructura pero vacía, y luego
campusvirtual.cualifica2.es
47 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Si el comando renombra más de una tabla, las operaciones de renombrado se realizan de izquierda a
derecha. Si quiere intercambiar dos nombres de tablas, puede hacerlo así (asumiendo que no existe
new_table TO old_table,
es
tmp_table TO new_table;
2.
ca
Mientras haya dos bases de datos en el mismo sistema de ficheros puede renombrar una tabla para
lifi
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
ua
Cuando ejecuta RENAME, no puede tener ninguna tabla bloqueada o transacciones activas. Debe
l.c
tener los permisos ALTER y DROP en la tabla original, y los permisos CREATE y INSERT en la nueva
ua
tabla.
rt
Si MySQL encuentra cualquier error en un renombrado múltiple, hace un renombrado inverso para
Sintaxis de DELETE
m
ca
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
campusvirtual.cualifica2.es
48 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
FROM table_references
[WHERE where_definition]
O:
es
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
2.
FROM tbl_name[.*] [, tbl_name[.*] ...]
ca
USING table_references
[WHERE where_definition]
lifi
ua
DELETE borra los registros de tbl_name que satisfacen la condición dada por where_definition, y
l.c
Si realiza un comando DELETE sin cláusula WHERE se borran todos los registros. Una forma más
rt
rápida de hacerlo, cuando no quiere saber el número de registros borrados, se usa TRUNCATE
i
TABLE.
sv
Si borra el registro conteniendo el máximo valor para una columna AUTO_INCREMENT, el valor se
pu
reusa para una tabla BDB, pero no para tablas MyISAM o InnoDB . Si borra todos los registros en la
m
tabla con DELETE FROM tbl_name (sin cláusula WHERE) en modo AUTOCOMMIT, la secuencia
ca
comienza para todos los tipos de tabla excepto para InnoDB y MyISAM. Hay algunas excepciones
Para tablas MyISAM y BDB , puede especificar una columna AUTO_INCREMENT secundaria en una
clave de múltiples columnas. En este caso, el reuso de valores borrados del inicio de la secuencia se
Si especifica LOW_PRIORITY, la ejecución de DELETE se retarda hasta que no hay más clientes
campusvirtual.cualifica2.es
49 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
leyendo de la tabla.
Para tablas MyISAM, si usa la palabra QUICK, el motor de almacenamiento no mezcla las hojas
del índice durante el borrado, que puede acelerar algunos tipos de operaciones de borrado.
En MySQL 5.0, la palabra clave IGNORE hace que MySQL ignore todos los errores durante el
proceso de borrar registros. (Los errores encontrados durante la etapa de parseo se procesan
de la forma habitual.) Los errores que se ignoran debido al uso de esta opción se retornan
como advertencias.
es
La velocidad de las operaciones de borrado pueden verse afectadas por factores.
2.
En tablas MyISAM, los registros borrados se mantienen en una lista enlazada y las operaciones
ca
INSERT siguientes reúsan antiguas posiciones de registro. Para reclamar espacio no usado y reducir
lifi
tamaño de fichero, use el comando OPTIMIZE TABLE o la utilidad myisamchk para reorganizar las
QUICK es más útil para aplicaciones en que los valores del índice para registros borrados se
ua
remplazan con valores similares de registros insertados posteriormente. En este caso, los agujeros
DELETE QUICK no es útil cuando los valores borrados conducen a bloques de índices no rellenos
sv
con un rango de valores índice para el que vuelven a ocurrir nuevas inserciones. En este caso, el uso
pu
de QUICK puede conducir a un gasto de espacio que queda sin reclamar. Aquí hay un ejemplo de
este escenario:
m
ca
2. Inserta varios registros en la tabla. Cada inserción resulta en un valor índice que se añade al final
del índice.
3. Borra un bloque de registros al final del rango de la columna usando DELETE QUICK.
En este escenario, los bloques de índice asociados con los valores de índice borrado quedan sin
rellenar pero no se mezclan con otros bloques de índice debido al uso de QUICK. Quedan sin
rellenar cuando hay nuevas inserciones, ya que los nuevos registros no tienen valores índice en el
campusvirtual.cualifica2.es
50 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
rango borrado. Además, quedan sin rellenar incluso si luego usa DELETE sin QUICK, a no ser que
algunos de los valores de índice borrados estén en los bloques de índice dentro o adyacentes a los
bloques no rellenos. Para reclamar el espacio de índice sin usar bajo estas circunstancias use
OPTIMIZE TABLE.
Si va a borrar varios registros de una tabla, puede ser más sencillo usar DELETE QUICK seguido por
OPTIMIZE TABLE. Esto reconstruye el índice en lugar de realizar varias operaciones de mezcla de
bloques de índice.
es
La opción de MySQL LIMIT row_count para DELETE le dice al servidor el máximo número de
2.
registros a borrar antes de retornar el control al cliente. Esto puede usarse para asegurar que un
ca
comando DELETE específico no tardará demasiado tiempo. Puede simplemente repetir el comando
DELETE hasta que el número de registros afectados sea menor que el valor LIMIT .
lifi
Si el comando DELETE incluye una cláusula ORDER BY, los registros se borran en el orden
ua
especificado por la cláusula. Esto es muy útil solo en conjunción con LIMIT. Por ejemplo, el siguiente
l.c
ejemplo encuentra registros coincidentes con la cláusula WHERE ordenados por timestamp_column,
ORDER BY timestamp_column
LIMIT 1;
m
ca
Puede especificar múltiples tablas en un comando DELETE para borrar registros de una o más
tablas dependiendo de una condición particular en múltiples tablas. Sin embargo, no puede usar
Para la primera sintaxis, solo los registros coincidentes de las tablas listadas antes de la cláusula
FROM se borran. Para la segunda sintaxis, solo los registros coincidentes de las tablas listadas en la
cláusula FROM (antes de la cláusula USING) se borran. El efecto es que puede borrar registros para
campusvirtual.cualifica2.es
51 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
varias tablas al mismo tiempo y tienen tablas adicionales que se usan para buscar:
O:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
Estos comandos usan las tres tablas al buscar registros a borrar, pero borrar los registros
es
coincidentes solo para las tablas t1 y t2.
2.
Los ejemplos anteriores muestran inner joins usando el operador coma, pero comandos DELETE de
ca
varias tablas pueden usar cualquier tipo de join permitido por comandos SELECT tales como LEFT
JOIN.
lifi
La sintaxis permite .* tras los nombres de tabla para compatibilidad con Access.
ua
Si usa un comando DELETE de varias tablas incluyendo tablas InnoDB para las que hay restricciones
l.c
de clave foránea, el optimizador MySQL puede procesar tablas en un orden distinto del de su
ua
relación padre/hijo. En este caso, el comando falla y se deshace. En su lugar, debe borrar de una
tabla única y confiar en la capacidad de ON DELETE que proporciona InnoDB para hacer que las
rt
Nota: En MySQL 5.0, debe usar el alias (si se dio) al referirse a un nombre de tabla:
pu
En MySQL 4.1:
m
Borrados cruzados entre bases de datos se soportan para borrados de varias tablas, pero en este
caso, debe referirse a las tablas sin usar alias. Por ejemplo:
Actualmente, no puede borrar desde una tabla y seleccionar de la misma tabla en una subconsultas.
Sintaxis de DO
campusvirtual.cualifica2.es
52 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
DO ejecuta la expresión pero no retorna ningún resultado. Esto es una abreviación de SELECT expr,
..., pero tiene la ventaja que es más rápido cuando no le importa el resultado.
DO es útil principalmente con funciones que tienen efectos colaterales, tales como
RELEASE_LOCK().
Sintaxis de HANDLER
es
HANDLER tbl_name OPEN [ AS alias ]
2.
ca
HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)
lifi
[ WHERE where_condition ] [LIMIT ... ]
ua
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
l.c
El comando HANDLER proporciona acceso directo a las interfaces del motor de la tabla. En MySQL
MyISAM y InnoDB .
El comando HANDLER ... OPEN abre una tabla, haciéndola accesible mediante posteriores
Este objeto de tabla no se comparte con otros flujos y no se cierra hasta que el flujo llama HANDLER
... CLOSE o el flujo termina. Si abre la tabla usando un alias, referencias posteriores a la tabla con
otros comandos HANDLER deben usar el alias en lugar del nombre de la tabla.
La primera sintaxis HANDLER ... READ recibe un registro donde el índice especificado satisface los
campusvirtual.cualifica2.es
53 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
especifique los valores de la columna índice como una lista separada por comas. Los valores
especificados para todas las columnas en el índice, o los valores específicos para un prefijo a la
izquierda de las columnas índice. Suponga que un índice incluye tres columnas llamadas col_a,
col_b, y col_c, en ese orden. El comando HANDLER puede especificar valores para las tres columnas
es
HANDLER ... index_name = (col_a_val,col_b_val) ...
2.
HANDLER ... index_name = (col_a_val) ...
ca
lifi
La segunda sintaxis HANDLER ... READ recibe un registro de la tabla en orden del índice que
que cumple la condición WHERE . Es más rápido que HANDLER tbl_name READ index_name cuando
se desea un escaneo completo de tabla. El orden de registro natural es el orden en que se almacenan
ua
los registros en un fichero de datos de una tabla MyISAM. Este comando funciona para tablas
rt
InnoDB también, pero no hay tal concepto porque no hay un fichero de datos separado.
i
sv
Sin una cláusula LIMIT, todas las formas de HANDLER ... READ reciben un único registros si una
pu
está disponible. Para retornar un número específico de registros, incluya una cláusula LIMIT. Tiene
HANDLER ... CLOSE cierra una tabla que se abrió con HANDLER ... OPEN.
ca
Nota: Para emplear la interfaz HANDLER para referirse a una tabla PRIMARY KEY, use el
HANDLER es un comando de bajo nivel. Por ejemplo, no proporciona consistencia. Esto es,
HANDLER ... OPEN no toma una muestra de la tabla, y no bloquea la tabla. Esto significa que tras
un comando HANDLER ... OPEN realizado, los datos de la tabla pueden ser modificados (por este o
campusvirtual.cualifica2.es
54 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
por otro flujo) y estas modificaciones pueden aparecer solo parcialmente en escaneos HANDLER ...
Hay varias razones para usar la interfaz HANDLER en lugar de comandos SELECT normales:
OPEN. El objeto se reusa para posteriores comandos HANDLER para esa tabla; no necesita
es
reinicializarse para cada una.
2.
Hay menos parseo.
ca
No hay sobrecarga del chequeo de consultas ni optimizador.
lifi
La tabla no tiene que estar bloqueada entre peticiones.
ua
La interfaz del handler no tiene que proporcionar una vista de los datos consistente (por ejemplo, se
l.c
permiten dirty reads), así que el motor puede usar optimización que SELECT no permite.
ua
HANDLER hace mucho más fácil portar aplicaciones que usen una interfaz tipo ISAM a MySQL.
rt
HANDLER le permite consultar una base de datos de forma difícil o imposible de realizar con
i
sv
SELECT. La interfaz de HANDLER es una forma más natural de consultar los datos cuando se
trabaja con aplicaciones que proporcionan una interfaz de usuario interactiva a la base de datos.
pu
Sintaxis de INSERT
m
ca
O:
campusvirtual.cualifica2.es
55 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
[INTO] tbl_name
O:
es
[INTO] tbl_name [(col_name,...)]
2.
SELECT ...
ca
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
lifi
INSERT inserta nuevos registros en una tabla existente. Las formas INSERT ... VALUES y INSERT ...
ua
SET del comando insertan registros basados en valores explícitamente especificados. La forma
l.c
INSERT ... SELECT inserta registros seleccionados de otra tabla o tablas. INSERT ...
ua
tbl_name es la tabla en que los registros deben insertarse. Las columnas para las que el comando
Si no especifica la lista de columnas para INSERT ... VALUES o INSERT ... SELECT, los valores para
pu
cada columna en la tabla deben proporcionarse en la lista VALUES o por el SELECT. Si no sabe el
m
Si no está ejecutando el modo estricto, cualquier columna que no tenga un valor asignado
explícitamente recibe su valor por defecto (explícito o implícito). Por ejemplo, si especifica una lista
de columnas que no nombra todas las columnas en la tabla, las no nombradas reciben sus valores
por defecto.
Si quiere que un comando INSERT genere un error a no ser que especifique explícitamente valores
para todas las columnas que no tienen un valor por defecto, debe usar modo STRICT .
campusvirtual.cualifica2.es
56 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Use DEFAULT para asignar a una columna explícitamente su valor por defecto. Esto hace más fácil
escribir comandos INSERT que asignan valores a todas las columnas excepto unas pocas, ya que le
permite evitar la escritura de una lista de valores VALUES incompleta. De otro modo, tendría que
escribir la lista de los nombres de columna correspondientes a cada valor en la lista VALUES .
En MySQL 5.0, puede usar DEFAULT (col_name) como forma más general que puede usarse en
es
Si la lista de columnas y la lista VALUES están vacías, INSERT crea un registro con cada conjunto de
2.
mysql> INSERT INTO tbl_name () VALUES();
ca
lifi
En modo STRICT obtendrá un error si una columna no tiene un valor por defecto. De otro modo,
MySQL usará el valor implícito para cualquier columna sin un valor explícito por defecto definido.
ua
Puede especificar una expresión expr para proporcionar un valor de columna. Esto puede involucrar
l.c
de un valor dado puede resultar en distintos valores insertados dependiendo del tipo de columna.
ua
Por ejemplo, insertar la cadena '1999.0e-2' en una columna INT, FLOAT, DE- CIMAL(10,6) , o YEAR
rt
resulta en los valores 1999, 19.9921, 19.992100,y 1999 insertados, respectivamente. La razón de
i
que el valor almacenado en las columnas INT y YEAR sea 1999 es que la conversión cadena-a-entero
sv
consulta solo el trozo de la parte inicial de la cadena que se puede considerar como un entero válido
pu
o año. Para las columnas de coma flotante o punto fijo, la conversión cadena-a-coma-flotante
Una expresión expr puede referirse a cualquier columna que se haya asignado antes en una lista de
valores. Por ejemplo, puede hacer esto porque el valor para col2 se refiere a col1, que se ha
asignado previamente:
Pero lo siguiente no es legal, ya que el valor para col1 se refiere a col2, que se asigna tras col1:
Una excepción involucra a columnas que contienen valores AUTO_INCREMENT . Como el valor
campusvirtual.cualifica2.es
57 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Si usa la palabra DELAYED, el servidor pone el registro o registros a ser insertados en un búffer, y el
cliente realizando el comando INSERT DELAYED puede continuar. Si la tabla está en uso, el servidor
trata los registros. Cuando la tabla se libera, el servidor comienza a insertar registros, chequeando
es
periódicamente para ver si hay alguna petición de lectura para la tabla. Si la hay, la cola de registros
2.
Si usa la palabra LOW_PRIORITY , la ejecución de INSERT se retrasa hasta que no hay otros clientes
ca
leyendo de la tabla. Esto incluye a otros clientes que comiencen a leer mientras que los clientes
lifi
existentes están leyendo, y mientras el comando INSERT LOW_PRIORITY está en espera. Es posible,
por lo tanto, para un cliente que realice un comando INSERT LOW_PRIORITY esperar durante
ua
mucho tiempo (o incluso para siempre) en un entorno de muchas lecturas. (Esto es un contraste de
l.c
INSERT DELAYED, que deja al cliente continuar. Tenga en cuenta que LOW_PRIORITY no debe
usarse normalmente con tablas MyISAM y que hacerlo deshabilita inserciones concurrentes.
ua
se arrancó con esa opción. Hace que las inserciones concurrentes no se usen.
i
sv
Los valores afectados por un INSERT pueden usarse usando la función mysql_affected_rows() de la
pu
API de C.
m
Si usa la palabra IGNORE en un comando INSERT , los errores que ocurren mientras se ejecuta el
ca
comando se tratan como advertencias. Por ejemplo, sin IGNORE, un registro que duplique un índice
UNIQUE existente o valor PRIMARY KEY en la tabla hace que un error de clave duplicada en el
comando se aborte. Con IGNORE, el registro todavía no se inserta, pero no se muestra error. Las
Con IGNORE, los valores invalidados se ajustan al valor más cercano y se insertan; las advertencias
se producen pero el comando no se aborta. Puede determinar con la función mysql_info() de la API
campusvirtual.cualifica2.es
58 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
índice UNIQUE o PRIMARY KEY, se realiza un UPDATE del antiguo registro. Por ejemplo, si la
columna a se declara como UNIQUE y contiene el valor 1, los siguientes dos comandos tienen
efectos idénticos:
es
El valor de registros afectados es 1 si el registros se inserta como un nuevo registro y 2 si un valor
2.
existente se actualiza.
ca
Nota: Si la columna b es única, el INSERT sería equivalente a este comando UPDATE :
lifi
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
ua
Si a=1 OR b=2 se cumple para varios registros, solo un registro se actualiza. En general, debería
l.c
intentar evitar usar una cláusula ON DUPLICATE KEY en tablas con claves únicas múltiples.
ua
MySQL 5.0 permite el uso de la función VALUES(col_name) en la cláusula UPDATE que se refiere a
rt
los valores de columna de la porción INSERT del comando INSERT ... UPDATE. En otras palabras,
ocurre conflicto de clave duplicada. Esta función es especialmente útil en inserciones de múltiples
pu
registros. La función VALUES() tiene sentido solo en comandos INSERT ... UPDATE y retorna NULL
de otro modo.
m
Ejemplo:
ca
campusvirtual.cualifica2.es
59 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Puede encontrar el valor usado para una columna AUTO_INCREMENT usando la función SQL
LAST_INSERT_ID() . Desde la API C, use la función mysql_insert_id() . Sin embargo, debe tener en
es
Si usa un comando INSERT ... VALUES con listas de múltiples valores o INSERT ... SELECT, el
2.
comando retorna una cadena de información en este formato:
ca
Records: 100 Duplicates: 0 Warnings: 0
lifi
Records indica el número de registros procesados por el comando. (Este no es necesariamente el
ua
número de registros realmente insertados, ya que Duplicates puede ser distinto a cero.) Duplicates
indica el número de registros que no pueden insertarse ya que duplicarían algunos valores de índice
l.c
únicos existentes. Warnings indicaba el número de intentos para insertar valores de columna que
ua
Insertar NULL en una columna que se ha declarado NOT NULL. Para comandos INSERT de
pu
múltiples columnas o comandos INSERT INTO... SELECT, la columna se asigna con el valor por
defecto para el tipo de datos de la columna. Este es 0 para tipos numéricos, la cadena vacía ('') para
m
tipos de cadenas, y el valor “cero” para tipos de fecha y hora. Los comandos INSERT INTO ...
ca
SELECT se tratan del mismo modo que inserciones de múltiples registros porque el servidor no
examina el resultado del SELECT para ver si retorna o no un único registro. (para un único registro
INSERT, no hay ninguna advertencia cuando NULL se inserta en una columna NOT NULL . En lugar
Poner en una columna numérica un valor fuera del rango de la columna. El valor se redondea al
Asigne un valor tal como '10.34 a' a una columna numérica. El texto final se elimina y la parte
campusvirtual.cualifica2.es
60 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
numérica se inserta. Si el valor de cadena no tiene parte inicial numérica, la columna se pone a 0.
Insertar una cadena en una columna de cadena (CHAR, VARCHAR, TEXT, o BLOB) que excede la
Insertar un valor en una columna de fecha u hora que es ilegal para el tipo de la columna. La
es
Sintaxis de INSERT ... SELECT
2.
ca
INSERT [LOW_PRIORITY HIGH_PRIORITY] [IGNORE]
lifi
[INTO] tb1_name [(col_name,...)]
ua
SELECT ...
l.c
Con INSERT ... SELECT, puede insertar rápidamente varios registros en un atabla desde una o
varias tablas.
i rt
Por ejemplo:
sv
SELECT tbl_temp1.fld_order_id
m
ca
En MySQL 5.0, especifique IGNORE explícitamente para ignorar registros que causarían violaciones
de clave duplicada.
En MySQL 5.0, la tabla objetivo del comando INSERT puede aparecer en la cláusula FROM de la
campusvirtual.cualifica2.es
61 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
parte SELECT de la consulta. (Esto no era posible en algunas versiones antiguas de MySQL.)
Para asegurar que el log binario puede usarse para recrear las tablas originales, MySQL no permite
Actualmente, no puede insertar en una tabla y seleccionar de la misma tabla en una subconsulta.
es
En las partes de valores de ON DUPLICATE KEY UPDATE puede referirse a una columna en otras
tablas, mientras no use GROUP BY en la parte SELECT . Un efecto lateral es que debe calificar los
2.
nombres de columna no únicos en la parte de valores.
ca
Puede usar REPLACE en lugar de INSERT para sobreescribir registros antiguos REPLACE es la
lifi
contraparte de INSERT IGNORE en el tratamiento de nuevos registros que contienen valores de
ua
clave única que duplican registros antiguos: Los nuevos registros se usan para reemplazar los
[REPLACE | IGNORE]
i
sv
[FIELDS
m
ca
[TERMINATED BY 'string']
[ESCAPED BY 'char' ]
[LINES
[STARTING BY 'string']
campusvirtual.cualifica2.es
62 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
[TERMINATED BY 'string']
[(col_name_or_user_var,...)]
es
El comando LOAD DATA INFILE lee registros desde un fichero de texto a una tabla a muy alta
2.
velocidad. El nombre de fichero debe darse como una cadena literal.
ca
Para más información acerca de la eficiencia de INSERT contra LOAD DATA INFILE y acelerar
lifi
LOAD DATA INFILE,
ua
En MySQL 5.0, el conjunto de caracteres indicado por la variable de sistema character_set_database
Puede cargar ficheros de datos usando la utilidad mysqlimport ; opera enviando un comando LOAD
rt
DATA INFILE al servidor. La opción - -local hace que mysqlimport lea ficheros de datos desde el
equipo cliente. Puede especificar la opción - -compress para obtener un mejor rendimiento en redes
i
sv
Si usa LOW_PRIORITY, la ejecución del comando LOAD DATA se retarda hasta que no haya más
m
Si especifica CONCURRENT con una tabla MyISAM que satisfaga la condición para inserciones
concurrentes (esto es, no contiene bloques libres en medio), entonces otros flujos pueden recibir
datos desde la tabla mientras se ejecuta LOAD DATA . Usar esta opción afecta al rendimiento de
LOAD DATA ligeramente, incluso si no hay otro flujo usando la tabla al mismo tiempo.
Si especificamos LOCAL, el programa cliente lee el fichero en el equipo cliente y lo envía al servidor.
Podemos indicar la ruta completa del fichero para especificar su localización exacta. Si indicamos la
campusvirtual.cualifica2.es
63 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Si no se especifica LOCAL , el fichero tiene que estar en el equipo servidor y el servidor lo lee
directamente.
es
Si se da una ruta relativa con uno o más componentes, el servidor busca este fichero relativo al
2.
ca
Si se da un nombre de fichero sin ninguna ruta, el servidor busca el fichero en el directorio de base
lifi
Tenga en cuenta que estas reglas significan que un fichero llamado ./myfile.txt se lee del directorio
ua
de datos del servidor, mientras que el mismo fichero llamado como myfile.txt se lee desde el
directorio de base de datos de la base de datos por defecto. Por ejemplo, el siguiente comando LOAD
l.c
DATA lee el fichero data.txt del directorio de la base de datos para db1 porque db1 es la base de
ua
datos actual, incluso si el comando carga explícitamente el fichero en una tabla en la base de datos
db2:
i rt
sv
Tenga en cuenta que las rutas de windows se especifican usando barras en lugar de antibarras. Si
Por razones de seguridad, al leer ficheros de texto localizados en el servidor, los ficheros deben
residir en el directorio de la base de datos o ser leíbles por todo el mundo. Además, para usar LOAD
Usar LOCAL es un poco más lento que dejar al servidor acceder al fichero directamente, porque el
contenido del fichero debe enviarse por la conexión desde el cliente al servidor. Por otra parte, no
campusvirtual.cualifica2.es
64 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
En MySQL 5.0, LOCAL funciona solo si su servidor y su cliente lo tienen activado. Por ejemplo, si
Si necesita LOAD DATA para leer desde un pipe, puede usar la siguiente técnica (aquí cargamos el
mkfifo /mysql/db/x/x
es
find / -ls > /mysql/db/x/x
2.
ca
mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
lifi
Las palabras REPLACE y IGNORE controlan el tratamiento de registros de entrada que duplican
los registros que tienen el mismo valor para una clave primaria o única que un registro existente).
ua
Si especifica IGNORE, los registros de entrada que dupliquen un registro existente en una clave
rt
LOCAL se ha especificado o no. Sin LOCAL, ocurre un error cuando se encuentra un valor de clave
i
sv
duplicado, y el resto del fichero de texto se ignora. Con LOCAL, el comportamiento por defecto es el
pu
mismo que si se especifica IGNORE, esto es porque el servidor no tiene forma de parar la
Si quiere ignorar restricciones de clave foránea durante la operación de carga, puede realizar un
ca
Si usa LOAD DATA INFILE en una tabla vacía MyISAM, todos los índices no únicos se crean en
batch separados (como para REPAIR TABLE). Esto hace LOAD DATA INFILE mucho más rápido
cuando tiene varios índices. Normalmente esto es muy rápido, pero en algunos casos extremos,
puede crear los índices incluso más rápido desactivándolos con ALTER TABLE ... DISABLE KEYS
antes de cargar el fichero en la tabla y usar ALTER TABLE ... ENABLE KEYS para recrear los índices
campusvirtual.cualifica2.es
65 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
LOAD DATA INFILE es el complemento de SELECT ... INTO OUTFILE. Para escribir datos de una
tabla en un fichero use SELECT ... INTO OUTFILE. Para leer el fichero de nuevo en una tabla, use
LOAD DATA INFILE. La sintaxis de las cláusulas FIELDS y LINES es la misma para ambos. Ambas
Si especifica una cláusula FIELDS , cada una de sus subcláusulas (TERMINATED BY, [OPTIONALLY]
ENCLOSED BY, y ESCAPED BY) también es opcional, excepto que debe especificar al menos una de
ellas.
es
Si no especifica una cláusula FIELDS, por defecto es como si hubiera escrito esto:
2.
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
ca
lifi
Si no especifica una cláusula LINES, por defecto es como si hubiera escrito esto:
ua
LINES TERMINATED BY '\n' STARTING BY ''
En otras palabras, por defecto LOAD DATA INFILE actúa como sigue al leer la entrada:
l.c
ua
Interpreta las ocurrencias de tabuladores, nuevas líneas o '\' precedidas por '\' como caracteres
pu
Por defecto SELECT ... INTO OUTFILE actúa como sigue al escribir la salida:
ca
Usa '\' para escapar las instancias de tabuladores, nuevas líneas o '\' que ocurren entre valores
de campos.
Tenga en cuenta que para escribir FIELDS ESCAPED BY '\\', debe escribir dos antibarras para que
campusvirtual.cualifica2.es
66 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Nota: Si ha generado el fichero de texto en un sistema Windows , puede tener que usar LINES
TERMINATED BY '\r\n' para leer correctamente el fichero, ya que los programas de Windows
típicamente usan dos caracteres como terminadores de línea . Algunos programas como WordPad,
pueden usar \r como terminador de línea al escribir ficheros. Para leer tales ficheros, use LINES
TERMINATED BY '\r'.
Si todas las líneas que quiere leer tienen un prefijo común que quiere ignorar, puede usar LINES
STARTING BY ' prefix_string' para ignorar el prefijo (y cualquier cosa antes del mismo). Si una línea
es
no incluye el prefijo, la línea entera se ignora. Nota prefix_string puede ocurrir en medio de una
2.
línea.
ca
Ejemplo:
lifi
mysql> LOAD DATA INFILE '/tmp/test.txt' ua
-> INTO TABLE test LINES STARTING BY "xxx";
l.c
xxx"row",1
rt
something xxx"row",2
i
sv
La opción IGNORE number LINES puede usarse para ignorar líneas al inicio del fichero. Por
m
ejemplo, puede usar IGNORE 1 LINES para ignorar una cabecera inicial que contenga los nombres
de las columnas:
ca
Cuando usa SELECT ... INTO OUTFILE junto con LOAD DATA INFILE para escribir datos desde una
base de datos en un fichero y luego lee datos del fichero de nuevo en la base de datos, las opciones
de tratamiento de fichero y de línea para ambos comandos deben coincidir. De otro modo, LOAD
DATA INFILE no interpreta los contenidos del fichero correctamente. Suponga que usa SELECT ...
campusvirtual.cualifica2.es
67 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
INTO OUTFILE para escribir un fichero con campos delimitados por comas:
es
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
2.
-> FIELDS TERMINATED BY ',';
ca
Si en lugar de esto trata de leer en el fichero con el comando mostrado aquí, no funcionaría porque
lifi
le dice a LOAD DATA INFILE que busque tabuladores entre campos:
ua
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
l.c
El resultado esperado es que cada línea de entrada se interprete como un único campo.
rt
LOAD DATA INFILE puede usarse para leer ficheros obtenidos de fuentes externas. Por ejemplo, un
i
sv
fichero en formato dBASE tiene campos separados por comas y entrecomillados por comillas dobles.
Si las líneas en el fichero se terminan con nuevas líneas, el comando mostrado aquí ilustra las
pu
Cualquiera de las opciones de tratamiento de campo o línea pueden especificarse como una cadena
vacía (''). Si no está vacía, los valores FIELDS [OPTIONALLY] ENCLOSED BY y FIELDS ESCAPED
BY deben ser un único carácter. Los valores FIELDS TERMINATED BY, LINES STARTING BY, y
LINES TERMINATED BY pueden tener más de un carácter . Por ejemplo, para escribir líneas
campusvirtual.cualifica2.es
68 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
terminadas por parejas de retorno de carro y nueva línea, o para leer un fichero conteniendo tales
Para leer un fichero que contenga bromas separadas por líneas consistentes de %%, puede hacer lo
siguiente
es
-> joke TEXT NOT NULL);
2.
ca
mysql> LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes
lifi
-> FIELDS TERMINATED BY ''
ua
-> LINES TERMINATED BY '\n%%\n' (joke);
l.c
(SELECT ... INTO OUTFILE), si omite la palabra OPTIONALLY, todos los campos se delimitan por el
ua
carácter ENCLOSED BY. Un ejemplo de tal salida (usando coma como el delimitador de campo) se
rt
muestra aquí:
i
sv
"1","a string","100.20"
pu
columnas que tienen datos de cadenas (tales como CHAR, BINARY, TEXT, o ENUM):
1,"a string",100.20
campusvirtual.cualifica2.es
69 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Tenga en cuenta que la ocurrencias del carácter ENCLOSED BY dentro de un campo se escapan
mediante un prefijo del carácter ESCAPED BY. También tenga en cuenta que si especifica un valor
ESCAPED BY vacío, es posible generar salida que no puede leerse correctamente con LOAD DATA
INFILE. Por ejemplo, la salida precedente tendría la siguiente apariencia si el carácter de escape
estuviera vacío. Observe que el segundo campo en la cuarta línea contiene una coma siguiendo la
es
1,"a string",100.20
2.
2,"a string containing a , comma",102.20
ca
lifi
3,"a string containing a " quote",102.20
ua
4,"a string containing a ", quote and comma",102.20
Para entrada, el carácter ENCLOSED BY, si está presente, se elimina del final de los valores de
l.c
Si el campo comienza con el carácter ENCLOSED BY, las instancias del mismo se reorganizan como
terminadores del campo solo si van seguidas por el campo o la secuencia TERMINATED BY . Para
pu
evitar ambigüedad, las ocurrencias del carácter ENCLOSED BY dentro de un campo se pueden
doblar y se interpretan como una única instancia del carácter. Por ejemplo, si se especifica
m
FIELDS ESCAPED BY controla cómo escribir o leer caracteres especiales. Si el carácter FIELDS
ESCAPED BY no está vacío, se usa como prefijo para los siguientes caracteres de salida:
campusvirtual.cualifica2.es
70 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
- ASCII 0 (lo que realmente se escribe a continuación del carácter de escape es '0' en ASCCI, no un
es
Si el carácter FIELDS ESCAPED BY está vacío, no se escapan caracteres y NULL se muestra como
NULL, no \N. Probablemente no es una buena idea especificar un carácter de escape vacío,
2.
particularmente si los valores de campos en sus datos contienen cualquiera de los caracteres en la
ca
lista dada.
lifi
Para entrada, si el carácter FIELDS ESCAPED BY no está vacío, las ocurrencias del mismo se
ua
eliminan y el siguiente carácter se toma literalmente como parte del campo. Las excepciones son un
'0' escapado o 'N' (por ejemplo, \0 o \N si el carácter de escape es '\'). Estas secuencias se
l.c
interpretan como ASCII NUL (un byte con valor cero) y NULL. Las reglas para tratamiento de NULL
se describen posteriormente.
ua
- Si LINES TERMINATED BY es una cadena vacío y FIELDS TERMINATED BY no está vacío, las
- Si los valores FIELDS TERMINATED BY y FIELDS ENCLOSED BY están vacíos (''), se usa un
m
formato fijo de registro (no delimitado). Con este formato, no se usan delimitadores entre campos
ca
(pero puede tener un terminador de línea). En su lugar, los valores de columna se escriben y leen
usando los anchos de muestra de las columnas. Por ejemplo, si una columna se declara como INT(7)
, los valores para la columna se escriben usando campos de siete caracteres. En la entrada, los
LINES TERMINATED BY se usa para separar líneas. Si una línea no contiene todos los campos, el
resto de columnas se asignan con sus valores por defecto. Si no tiene un terminador de línea, debe
asignarlo a ''. En este caso, el fichero de texto debe contener todos los campos para cada registro.
campusvirtual.cualifica2.es
71 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
El formato fijo de registro también afecta al tratamiento de valores NULL, como se describe
posteriormente. Tenga en cuenta que el formato de tamaño fijo no funciona si está usando un
El tratamiento de valores NULL varía en función de las opciones FIELDS y LINES en uso:
- Para los valores FIELDS y LINES por defecto, NULL se escribe como \N para la salida, y \N para la
es
- Si FIELDS ENCLOSED BY no está vacío, un campo que contenga el literal NULL como valor se lee
2.
como el valor NULL. Esto difiere de la palabra NULL delimitada por caracteres FIELDS ENCLOSED
ca
lifi
- Si FIELDS ESCAPED BY está vacío, NULL se escribe como la palabra NULL.
ua
- Con formato fijo de registro (lo que ocurre cuando FIELDS TERMINATED BY y FIELDS ENCLOSED
BY están vacíos), NULL se escribe como una cadena vacía. Tenga en cuenta que esto hace que
l.c
ambos valores NULL y cadenas vacías en la tabla sean indistinguibles cuando se escriben en el
fichero ya que ambos se escriben como cadenas vacías. Si necesita distinguir entre ambos al leer del
ua
Si especifica un separador que es igual o prefijo de otro, LOAD DATA INFILE no será capaz de
ca
interpretar la entrada correctamente. Por ejemplo, la siguiente cláusula FIELDS causaría problemas:
Si FIELDS ESCAPED BY está vacío, un valor que contenga una ocurrencia de FIELDS ENCLOSED
BY o LINES TERMINATED BY seguido por el valor FIELDS TERMINATED BY causa que LOAD DATA
INFILE pare de leer un campo o línea demasiado rápido. Esto ocurre porque LOAD DATA INFILE no
campusvirtual.cualifica2.es
72 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Por defecto, cuando no se proporciona una lista al final de un comando LOAD DATA INFILE, las
líneas de entrada se espera que contengan un campo para cada columna de la tabla. Si quiere
cargar solo algunas columnas de una tabla, especifique una lista de columnas:
es
Debe especificar una lista de columnas si el orden de los campos del fichero de entrada difiere del
2.
orden de las columnas en la tabla. De otro modo, MySQL no puede decir cómo hacer coincidir los
ca
campos de entrada con las columnas de la tabla.
lifi
Antes de MySQL 5.0.3, la lista de columnas debe contener solo nombres de columnas en la tabla que
ua
se carga, y la cláusula SET no se soporta. Desde MySQL 5.0.3, la lista de columnas puede contener
nombres de columna o variables y la cláusula SET se soporta. Esto le permite asignar valores de
l.c
entrada a variables de usuario, y luego realizar transformaciones con estos valores antes de asignar
Las variables de usuario en la cláusula SET puede usarse de distintos modos. El siguiente ejemplo
rt
usa la primera columna en el fichero de datos directamente para el valor de tl.columnl, y asigna la
i
sv
segunda columna a una variable de usuario que está sujeta a una operación de división antes de ser
pu
INTO TABLE tl
(columnl, @var1)
La cláusula SET puede usarse para proporcionar valores no derivados del fichero de entrada. Los
campusvirtual.cualifica2.es
73 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
También puede descartar un valor de entrada asignándolo a una variable de usuario y no asignando
es
INTO TABLE t1
2.
(column1, @dummy, column2, @dummy, column3);
ca
El uso de la lista de columnas/variables y la cláusula SET está sujeto a las siguientes restricciones:
lifi
Las asignaciones en la cláusula SET deben tener solo nombres de columna en el lado izquierdo del
ua
operador de asignación.
l.c
Puede usar subconsultas en la parte derecha de la asignación de SET. Una subconsulta que retorne
un valor a ser asignado a otra columna solo puede ser una subconsulta escalar. Además, no puede
ua
usar una subconsulta para seleccionar desde la tabla que se está cargando.
rt
Las líneas ignoradas por un cláusula IGNORE no se procesan por parta de la lista de
i
sv
Las variables de usuario no pueden usarse al cargar datos con formato de registro ya que las
Al procesar una línea de entrada, LOAD DATA la divide en campos y usa los valores según la lista de
resultante en la tabla. Si hay disparadores BEFORE INSERT o AFTER INSERT para la tabla, se
Si una línea de entrada tiene demasiados campos, los campos extra se ignoran y el número de
advertencias se incrementa.
Si una línea de entrada no tiene suficientes campos, las columnas de la tabla que no tienen entrada
campusvirtual.cualifica2.es
74 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Un valor de campo vacío se interpreta de forma distinta que si el valor no está presente:
Para tipos de fecha y hora, la columna obtiene el valor “cero” apropiado para el tipo.
Estos son los mismos valores que resultan si asigna una cadena vacía explícitamente a un tipo de
es
Las columnas TIMESTAMP obtienen la fecha y hora actuales solo si hay un valor NULL para la
2.
columna (esto es, \N), o (para la primera columna TIMESTAMP únicamente) si se omite TIMESTAMP
ca
de la lista de campos cuando se especifica una.
lifi
LOAD DATA INFILE trata todas las entradas como cadenas, así que no puede usar valores
ua
numéricos para columnas ENUM o SET del modo en que puede hacerlo con comandos INSERT .
Cuando acaba el comando LOAD DATA INFILE, retorna una cadena de información con el siguiente
ua
formato:
rt
Las advertencias se producen bajo las mismas circunstancias que cuando los valores se insertan
pu
mediante el comando INSERT, excepto que LOAD DATA INFILE también genera advertencias
cuando hay muy pocos o demasiados campos en el registro de entrada. Las advertencias no se
m
almacenan en ningún lugar; el número de las mismas puede usarse solo como indicación de si todo
ca
ha ido bien.
En MySQL 5.0, puede usar SHOW WARNINGS para obtener una lista de las primeras
Sintaxis de REPLACE
campusvirtual.cualifica2.es
75 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
O:
[INTO] tbl_name
es
O:
2.
REPLACE [LOW_PRIORITY | DELAYED]
ca
[INTO] tbl_name [(col_name,...)]
SELECT ...
lifi
ua
REPLACE funciona exactamente como INSERT, excepto que si un valor de la tabla tiene el mismo
l.c
valor que un nuevo registro para un índice PRIMARY KEY o UNIQUE , el antiguo registro se borra
ua
Tenga en cuenta que a menos que la tabla tenga un índice PRIMARY KEY, o UNIQUE usar un
i
comando REPLACE no tiene sentido. Es equivalente a INSERT, ya que no hay índice para determinar
sv
Los valores para todas las columnas se toman de los valores especificados en el comando REPLACE.
m
Cualquier columna no presente adquiere su valor por defecto, como ocurre con INSERT. No puede
ca
referirse a valores del registro actual y usarlos en el nuevo registro. Si usa un comando tal como
como DEFAULT( col_name), así que es equivalente a SET col_name = DEFAULT( col_name) + 1.
Para ser capaz de usar REPLACE, debe tener los permisos INSERT y DELETE para la tabla.
El comando REPLACE retorna un contador con el número de registros afectados. Esta es la suma de
un registro y no se borra ninguno. Si el contador es mayor que 1, uno o más registros se borraron
antes de insertar el nuevo. Es posible para un único registro reemplazar más de un registro antiguo
campusvirtual.cualifica2.es
76 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
si la tabla contiene múltiples índices únicos y el nuevo registro duplica valores para distintos
El contador de registros afectados hace fácil determinar si REPLACE solo añadió un registro o si
es
en una subconsulta.
2.
Aquí sigue en más detalle el algoritmo usado (también se usa con LOAD DATA ... REPLACE):
ca
1. Intenta insertar el nuevo registro en la tabla
lifi
2. Mientras falle la inserción debido a error de clave duplicada por clave única o primaria:
ua
A- Borra de la tabla el registro conflictivo que tiene el valor de clave duplicada
l.c
Sintaxis de SELECT
rt
SELECT
i
sv
[HIGH_PRIORITY]
m
[STRAIGHT_JOIN]
ca
[FROM table_references
campusvirtual.cualifica2.es
77 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
[WHERE where_definition]
[HAVING where_definition]
es
[ASC | DESC] , ...]
2.
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
ca
[PROCEDURE procedure_name(argument_list)]
- where_definition consiste en la palabra clave WHERE seguida por una expresión que indica la
pu
condición o condiciones que deben satisfacer los registros para ser seleccionados.
m
SELECT también puede usarse para recuperar registros computados sin referencia a ninguna tabla.
ca
Por ejemplo:
-> 2
Todas las cláusulas usadas deben darse exactamente en el orden mostrado en la descripción de la
sintaxis. Por ejemplo, una cláusula HAVING debe ir tras cualquier cláusula GROUP BY y antes de
campusvirtual.cualifica2.es
78 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
- Una select_expr puede tener un alias usando AS alias_name. El alias se usa como el nombre de
columna de la expresión y puede usarse en cláusulas GROUP BY, ORDER BY, o HAVING . Por
ejemplo:
La palabra clave AS es opcional cuando se usa un alias para select_expr. El ejemplo precedente
es
podría haberse escrito como:
2.
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
ca
-> FROM mytable ORDER BY full_name;
lifi
Como AS es opcional, puede ocurrir un sutil problema si olvida la coma entre dos expresiones
ua
select_expr : MySQL interpreta el segundo como un nombre de alias. Por ejemplo, en el siguiente
Por esta razón, es una buena práctica poner los alias de columnas usando AS.
i
sv
- No se permite usar un alias de columna en una cláusula WHERE, ya que el valor de columna puede
- La cláusula FROM table_references indica la tabla desde la que recibir registros. Si nombra más de
m
una tabla, está realizando unjoin,. Para cada tabla especificada, puede opcionalmente especificar un
ca
alias.
campusvirtual.cualifica2.es
79 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
El uso de USE INDEX, IGNORE INDEX, FORCE INDEX para dar al optimizador pistas acerca de
En MySQL 5.0, puede usar SET max_seeks_for_key= value como alternativa para forzar a MySQL a
- Puede referirse a una tabla dentro de la base de datos actual como tbl_name (dentro de la base de
datos actual) , o como db_name.tbl_name para referirse a una base de datos explícitamente. Puede
es
referirse a una columna como col_name, tbl_name.col_name, o db_name.tbl_name.col_name. No
2.
ser que la referencia fuese ambigua
ca
- En MySQL 5.0, puede especificar DUAL como nombre de tabla falso en asignaciones donde no se
lifi
referencian tablas: ua
mysql> SELECT 1+1 FROM DUAL;
l.c
-> 2
ua
DUAL es una característica puramente de compatibilidad. Otros servidores requieren esta sintaxis.
rt
- Una referencia de tabla puede tener un alias usando tbl_name AS alias_name o tbl_name
i
sv
alias_name:
pu
mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 -> WHERE t1.name =
t2.name;
m
mysql> SELECT t1.name, t2.salary FROM employee t1, info t2 -> WHERE t1.name = t2.name;
ca
- En la cláusula WHERE , puede usar cualquiera de las funciones que soporta MySQL, excepto para
- Las columnas seleccionadas para la salida pueden ser referidas en cláusulas ORDER BY y GROUP
BY usando nombres de columnas, alias, o posiciones. Las posiciones de columnas son enteros y
comienzan con 1:
campusvirtual.cualifica2.es
80 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
-> ORDER BY r, s;
-> ORDER BY 2, 3;
es
Para ordenar en orden inverso, añada la palabra clave DESC (descendiente) al nombre de la
2.
columna en la cláusula ORDER BY por la que está ordenando. Por defecto es orden ascendente;
ca
puede especificarse explícitamente usando la palabra clave ASC.
lifi
El uso de posiciones de columna está obsoleto ya que la sintaxis se ha eliminado del estándar SQL.
ua
- Si usa GROUP BY, los registros de salida se ordenan según las columnas GROUP BY como si
tuviera un ORDER BY para las mismas columnas. MySQL 5.0 extiende la cláusula GROUP BY para
l.c
que pueda especificar ASC y DESC tras las columnas nombradas en la cláusula:
ua
- MySQL extiende el uso de GROUP BY para permitir seleccionar campos que no se mencionan en la
i
sv
- La cláusula HAVING se aplica casi al final, justo antes de que los elementos se envíen al cliente, sin
ca
Antes de MySQL 5.0.2, una cláusula HAVING podía referirse a cualquier columna o alias nombrado
en una select_expr en la lista SELECT o en subconsultas externas, y para funciones agregadas. Sin
embargo, el estándar SQL requiere que HAVING debe referirse sólo a columnas en la cláusula
GROUP BY o columnas usadas en funciones agregadas. Para acomodar ambos estándares SQL y el
MySQL 5.0.2 y posterior permite a HAVING referirse a columnas en la lista SELECT, en la cláusula
campusvirtual.cualifica2.es
81 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Por ejemplo, el siguiente comando funciona en MySQL 5.0.2 pero produce un error en versiones
anteriores:
siguiente comando, col2 es ambiguo porque se usa tanto para un alias como para un nombre de
columna:
es
mysql> SELECT COUNT(coll) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
2.
Se da preferencia al comportamiento SQL estándar, así que si un nombre de columna HAVING se
ca
usa en un GROUP BY y como alias de columna en la lista de columnas de salida, se da preferencia a
lifi
la columna en GROUP BY .
ua
- No use HAVING para elementos que deban estar en la cláusula WHERE . Por ejemplo, no escriba lo
- La cláusula HAVING puede referirse a funciones de agregación, algo que no puede hacer la
i
sv
cláusula WHERE:
pu
- La cláusula LIMIT puede usarse para restringir el número de registros retornados por el comando
SELECT. LIMIT tiene uno o dos argumentos numéricos, que deben ser enteros positivos (incluyendo
cero).
Con dos argumentos, el primer argumento especifica el desplazamiento del primer registro a
campusvirtual.cualifica2.es
82 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Por compatibilidad con PostgreSQL, MySQL también soporta la sintaxis LIMIT row_count OFFSET
offset.
Para recibir todos los registros de un desplazamiento hasta el final del conjunto de resultados, puede
usar algún número grande para el segundo parámetro. Este comando recibe todos los registros
es
mysql> SELECT * FROM table LIMIT 95,18446744073 709551615;
2.
Con un argumento, el valor especifica el número de registros a retornar desde el comienzo del
ca
conjunto de resultados:
lifi
mysql> SELECT * FROM table LIMIT 5; # Retrieve first 5 rows
ua
En otras palabras, LIMIT n es equivalente a LIMIT 0,n.
l.c
- La forma SELECT ... INTO OUTFILE 'file_name' de SELECT escribe los registros seleccionados en
ua
un fichero. El fichero se crea en el equipo servidor, así que debe tener el permiso FILE para usar
esta sintaxis. El fichero no puede existir, que entre otras cosas evita destruir ficheros cruciales tales
rt
El comando SELECT ... INTO OUTFILE existe principalmente para dejarle volcar una tabla
pu
distinto al equipo servidor, no puede usar SELECT ... INTO OUTFILE. En tal caso, debería usar
m
algún comando como mysql -e "SELECT ..." > file_name en el equipo cliente para generar el fichero.
ca
SELECT ... INTO OUTFILE es el complemento de LOAD DATA INFILE; la sintaxis para la parte
export_options del comando consiste en las mismas cláusulas FIELDS y LINES usadas con el
FIELDS ESCAPED BY controla cómo escribir caracteres especiales. Si el carácter FIELDS ESCAPED
BY no está vacío, se usa como prefijo para los siguientes caracteres en la salida:
campusvirtual.cualifica2.es
83 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
- ASCII 0 (que se escribe siguiendo el carácter de escape ASCII '0', no un byte con valor cero)
Si el carácter FIELDS ESCAPED BY está vacío, no hay ningún carácter de escape y NULL se
muestra por salida como NULL, no \N. Probablemente no es buena idea especificar un carácter de
escape vacío, particularmente si los valores de los campos de sus datos contienen cualquiera de los
es
caracteres en la lista dada.
2.
La razón de lo anterior es que debe escapar cualquier carácter FIELDS TERMINATED BY,
ca
ENCLOSED BY, ESCAPED BY, o LINES TERMINATED BY para ser capaz de volver a leer el fichero
lifi
correctamente. ASCII NUL se escapa para hacer más fácil visualizarlo con algunos visores.
ua
El fichero resultante no tiene que estar conforme a la sintaxis SQL, así que nada más debe
escaparse.
l.c
Este es un ejemplo que produce un fichero en formato de valores separados por comas usado por
ua
varios programas:
rt
FROM test_table;
ca
- Si usa INTO DUMPFILE en lugar de INTO OUTFILE, MySQL escribe solo un registro en el fichero,
sin ninguna terminación de línea o columna y sin realizar ningún proceso de escape. Esto es útil si
- Nota: cualquier fichero creado por INTO OUTFILE o INTO DUMPFILE es modificable por todos los
usuarios en el equipo servidor. La razón es que el servidor MySQL no puede crear un fichero con un
propietario distinto al usuario que está en ejecución (nunca debe ejecutar mysqld como root por esta
y otras razones). El fichero debe ser modificable por todo el mundo para que pueda manipular sus
campusvirtual.cualifica2.es
84 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
contenidos.
- Una cláusula PROCEDURE nombra a un procedimiento que debe procesar los datos en el conjunto
de resultados.
- Si usa FOR UPDATE en un motor de almacenamiento que usa bloqueo de páginas o registros, los
registros examinados por la consulta se bloquean para escritura hasta el final de la transacción
actual. Usar LOCK IN SHARE MODE crea un bloqueo compartido que evita a otras transacciones
es
actualizar o borrar los registros examinados.
2.
Tras la palabra clave SELECT, puede usar un número de opciones que afectan la operación del
comando.
ca
lifi
Las opciones ALL, DISTINCT, and DISTINCTROW especifican si deben retornarse los registros
duplicados. Si no se da ninguna de estas opciones, por defecto es ALL (se retornan todos los
ua
registros coincidentes). DISTINCT y DISTINCTROW son sinónimos y especifican que los registros
HIGH_PRIORITY, STRAIGHT_JOIN, y opciones que comiencen con SQL_ son extensiones de MySQL
ua
al estándar SQL.
rt
- HIGH_PRIORITY da a SELECT prioridad más alta que un comando que actualice una tabla. Debe
i
sv
usar esto solo para consultas que son muy rápidas y deben realizarse una vez. Una consulta SELECT
pu
HIGH_PRIORITY que se realiza mientras la tabla está bloqueada para lectura se efectúa incluso si
HIGH_PRIORITY no puede usarse con comandos SELECT que sean parte de una UNION.
ca
- STRAIGHT_JOIN fuerza al optimizador a hacer un join de las tablas en el orden en que se listan en
la cláusula FROM . Puede usarlo para acelerar una consulta si el optimizador hace un join con las
- SQL_BIG_RESULT puede usarse con GROUP BY o DISTINCT para decir al optimizador que el
conjunto de resultados tiene muchos registros. En este caso, MySQL usa directamente tablas
temporales en disco si son necesarias con una clave en los elementos GROUP BY .
campusvirtual.cualifica2.es
85 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
- SQL_BUFFER_RESULT fuerza a que el resultado se ponga en una tabla temporal . Esto ayuda a
MySQL a liberar los bloqueos de tabla rápidamente y ayuda en casos en que tarda mucho tiempo en
- SQL_SMALL_RESULT puede usarse con GROUP BY o DISTINCT para decir al optimizador que el
conjunto de resultados es pequeño. En este caso, MySQL usa tablas temporales rápidas para
almacenar la tabla resultante en lugar de usar ordenación. En MySQL 5.0, esto no hará falta
normalmente.
es
- SQL_CALC_FOUND_ROWS le dice a MySQL que calcule cuántos registros habrán en el conjunto de
2.
resultados, sin tener en cuenta ninguna cláusula LIMIT. El número de registros pueden encontrarse
ca
con SELECT FOUND_ROWS().
lifi
- SQL_CACHE le dice a MySQL que almacene el resultado de la consulta en la caché de consultas si
está usando un valor de query_cache_type de 2 o DEMAND. Para una consulta que use UNION o
ua
subconsultas, esta opción afecta a cualquier SELECT en la consulta.
l.c
consultas. Para una consulta que use UNION o subconsultas esta opción afecta a cualquier SELECT
en la consulta.
i rt
sv
Las cláusulas column_definition usan la misma sintaxis para ADD y CHANGE así
pu
como CREATE TABLE. Tenga en cuenta que esta sintaxis incluye el nombre de la
columna, no solo el tipo.
m
Verdadero.
ca
Falso.
Verdadero.
campusvirtual.cualifica2.es
86 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Falso.
LOAD DATA INFILE es el complemento de SELECT ... INTO OUTFILE. Para escribir
es
datos de una tabla en un fichero use SELECT ... INTO OUTFILE. Para leer el fichero
de nuevo en una tabla, use LOAD DATA INFILE. La sintaxis de las cláusulas FIELDS y
2.
LINES es la misma para ambos. Ambas son opcionales, pero FIELDS debe preceder a
LINES si se especifican ambas.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
87 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Mapeo de Asociaciones.
Muchos-uno.
Uno-uno.
Uno-muchos.
Muchos-muchos.
es
2.
Si por ejemplo tenemos la tabla Personas, la cual está asociada con la tabla Direcciones, esta
ca
relación es de Muchos-uno ya que una persona puede tener varias direcciones.
lifi
En el archivo XML de mapeado de Hibernate, quedaría un archivo similar a este:
ua
l.c
ua
i rt
sv
pu
m
De tal forma para cada tipo de asociación las características van cambiando en el XML.
ca
@Entity
@Table(name = "PERSONAS")
public class Persona{
//Otras propiedades y metodos
private Set<Dirección> direcciones = new HashSet<Direccion>();
campusvirtual.cualifica2.es
88 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
@Entity
@Table(name = "direcciones")
public class Direccion{
Persona persona;
//...............
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_persona", nullable = false)
public Stock getPersona() {
es
return this.persona;
}
//..............
2.
}
ca
Como podemos observar en la clase Persona hemos utilizado la anotación @OneToMany para
lifi
referirnos que una persona tiene múltiples direcciones, y en Direccion @ManyToOne para definir la
relación inversa. Con @JoinColumn en Dirección indicamos la columna con la id que utiliza
ua
Direccion para relacionarse con persona.
l.c
Fetch.EAGER, esto le indica a Hibernate cuando realiza la consulta para dicha relación. Con LAZY
la consulta a la base de datos se lleva a cabo cuando se intenta acceder a la propiedad direcciones,
rt
campusvirtual.cualifica2.es
89 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Mapeo de Herencia.
La herencia es fundamental en la orientación de objetos. Esto hace que el código pueda ser
es
Tabla por jerarquía de clases.
2.
Tabla por clase concreta.
ca
lifi
También se pueden utilizar estrategias distintas para diferentes ramas de una jerarquía. Por ejemplo
se puede mezclar tabla por jerarquía y tabla por subclase bajo el mismo elemento <class>,
ua
haciendo uso de elementos <subclass> y <join>. También es posible definir las jerarquías en
l.c
ficheros XML distintos directamente bajo <hibernate-mapping>. Esto permite extender una
jerarquía de clases añadiendo un nuevo fichero de mapeo y especificando con el atributo extends en
ua
<subclass> el nombre de una clase padre. Anteriormente este método requería un orden concreto
de los ficheros sin embargo desde la tercera versión el orden es irrelevante cuando se utiliza
rt
extends.
i
sv
<hibernate-mapping>
pu
</hibernate-mapping>
ca
Supongamos que tenemos una interfaz Payment con las implementaciones CreditCardPayment,
manera:
campusvirtual.cualifica2.es
90 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
<generator class="native"/>
</id>
<discriminator column="PAYMENT_TYPE" type="string"/>
<property name="amount" column="AMOUNT"/>
...
<subclass name="CreditCardPayment" discriminator-value="CREDIT">
<property name="creditCardType" column="CCTYPE"/>
...
</subclass>
<subclass name="CashPayment" discriminator-value="CASH">
...
</subclass>
<subclass name="ChequePayment" discriminator-value="CHEQUE">
...
es
</subclass>
</class
>
2.
ca
Mediante este metodo se utiliza una sola tabla. Hay una limitacion en esta estrategia, las columnas
</id>
<property name="amount" column="AMOUNT"/>
i
...
sv
...
</joined-subclass>
<joined-subclass name="CashPayment" table="CASH_PAYMENT">
m
<key column="PAYMENT_ID"/>
...
ca
</joined-subclass>
<joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
<key column="PAYMENT_ID"/>
...
</joined-subclass>
</class>
Con esta estrategia cuatro tablas son requeridas. Las tres tablas asociadas a las subclases tendrán
relaciones por clave primaria a la clase padre, por lo tanto el modelo de la relación es Uno-a-Uno
OtrosORM utilizan una implementación diferente que requiere una columna discriminadora en la
campusvirtual.cualifica2.es
91 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
tabla de la clase padre. El enfoque adoptado por Hibernate es mucho más difícil de implementar,
pero sin duda más correcto desde un punto de vista relacional. Si desea utilizar una columna
discriminadora con la estrategia de tabla por subclase, puede combinar el uso de <subclass> y
es
<property name="amount" column="AMOUNT"/>
...
2.
<subclass name="CreditCardPayment" discriminator-value="CREDIT">
<join table="CREDIT_PAYMENT">
ca
<key column="PAYMENT_ID"/>
<property name="creditCardType" column="CCTYPE"/>
...
lifi
</join>
</subclass>
<subclass name="CashPayment" discriminator-value="CASH">
ua
<join table="CASH_PAYMENT">
<key column="PAYMENT_ID"/>
...
l.c
</join>
</subclass>
<subclass name="ChequePayment" discriminator-value="CHEQUE">
ua
</join>
</subclass>
i
sv
</class>
pu
En este caso se crearía una tabla por cada clase hija pero no la tabla padre, es decir las tablas hijas
<class name="Payment">
<id name="id" type="long" column="PAYMENT_ID">
<generator class="sequence"/>
</id>
<property name="amount" column="AMOUNT"/>
...
<union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
<property name="creditCardType" column="CCTYPE"/>
...
</union-subclass>
<union-subclass name="CashPayment" table="CASH_PAYMENT">
...
</union-subclass>
campusvirtual.cualifica2.es
92 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
La limitación con esta estrategia es que si una propiedad se asigna a la clase padre, el nombre de
columna debe ser el mismo en todas las tablas hijas. La semilla para generar la clave primaria tiene
que ser compartida a través de todas las subclases de una jerarquía, es decir, dos objetos herederos
es
Si la clase padre es abstracta (abstract="true") no requiere de una tabla en la base de datos, en otro
caso se debe crear una tabla asociada para guardar sus instancias.
2.
ca
La implementación de tabla por subclase de Hibernate no requiere una columna
lifi
discriminadora. OtrosORM utilizan una implementación diferente que requiere
una columna discriminadora en la tabla de la clase padre.
ua
Verdadero.
l.c
Falso.
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
93 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Session mantiene una conexión física con la base de datos, está diseñado para ser instanciado cada
Los objetos Session no deben estar abiertos durante largos periodos de tiempo ya que no son thread
safe, es decir su uso entre distintos hilos no garantiza la integridad del proceso. En Hibernate un
es
objeto recuperado por Session puede tener varios estados:
2.
Transitorio: Cuando un objeto está en estado transitorio significa que acaba de ser instanciado
ca
y no se encuentra en ninguna Session de Hibernate. Esto se traduce como que en la base de
lifi
datos no existe aún el objeto y puede ser destruido por el recolector de basura.
Separado: Este estado se produce cuando el objeto ha pasado por persistente, pero su Session
ua
ya no existe. Quiere decir que el objeto ya no tiene una referencia válida y puede que su valor
l.c
se haya perdido. Aun así este objeto puede volver a formarse si no se han eliminado todas sus
referencias.
ua
//.....................
import org.hibernate.HibernateException;
import org.hibernate.Session;
m
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
ca
campusvirtual.cualifica2.es
94 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return ID;
}
}
Como hemos visto SessionFactory abre una nueva sesion. Con el objeto session podemos iniciar una
transacción devolviendo un objeto que luego usamos para realizar el commit de los cambios o el
es
rollback. El método save devuelve la id generada tras insertar el objeto en la tabla.
2.
Con session.update(obj) podríamos actualizar los cambios de un objeto y con delete borrarlo.
ca
También podemos recuperar un objeto directamente con la id sin escribir una consulta HQL:
lifi
(Person)session.get(Person.class, ID); ua
l.c
ua
i rt
sv
pu
m
ca
campusvirtual.cualifica2.es
95 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Optimización.
Implementar persistencia con Hibernate es bastante sencillo. Pero lo que empieza siendo fácil puede
empezar a ser un problema cuando surgen problemas de rendimiento. Hay varias formas de mejorar
Hibernate Statistics
Hibernate posee funciones para realizar un registro de las operaciones realizadas y representar
es
determinadas estadísticas, estas se pueden activar estableciendo el parámetro de
2.
configuración hibernate.generate_statistics a true y org.hibernate.stat a DEBUG. Ahora se
podrá observar dicha informacion durante el desarrollo y compararlo con las expectativas
ca
lifi
2015-03-03 20:28:52,484 DEBUG [org.hibernate.stat.internal.ConcurrentStatisticsImpl] (default task-1)
HHH000117: HQL: Select p From Product p, time: ms, rows: 10
2015-03-03 20:28:52,484 INFO [org.hibernate.engine.internal.StatisticalLoggingSessionEventListener]
ua
(default task-1) Session Metrics {
8728028 nanoseconds spent acquiring 12 JDBC connections;
295527 nanoseconds spent releasing 12 JDBC connections;
l.c
collections)
}
pu
También hay que tener en cuenta que en desarrollo se realizan unas pocas peticiones comparadas
m
con un entorno de producción. Se podrían utilizar herramientas de estrés contra el servidor local
Consultas lentas
El lenguaje HQL permite abstraernos de la base de datos específica, pero las consultas que se
generan pueden no ser las óptimas. Si se le da más importancia al rendimiento que a la portabilidad
para operaciones complejas es mejor utilizar consultas nativas. Sin embargo cuando se utilizan
consultas nativas se reciben arrays de objetos (Object[]), se pueden mapear estos objetos a las clases
campusvirtual.cualifica2.es
96 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Hemos comentado anteriormente que podemos cargar los objetos relacionados de dos formas,
realizar otra consulta al acceder a la propiedad o cuando obtenemos el objeto principal de la base de
datos. Se debe elegir el tipo apropiado en función de la frecuencia y uso que demos a estos datos. Si
se utilizan con poca frecuencia es más recomendable elegir LAZY por ejemplo.
También es posible realizar una captura EAGER en una consulta con la palabra clave FETCH:
es
SELECT DISTINCT a FROM Author a JOIN FETCH a.books b
2.
Operaciones pesadas
ca
Si se van a realizar operaciones a un gran conjunto de datos es mejor si dejamos que la base de
datos lo lleve a cabo y nos devuelva el resultado. Aparte de las operaciones que se pueden realizar
lifi
con HQL se puede llamar a procediemientos implementados en la propia base de datos a través de
ua
@NamedStoredProcedureQuery:
l.c
@NamedStoredProcedureQuery(
name = "getBooks",
ua
procedureName = "get_books",
resultClasses = Book.class,
parameters = { @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type =
rt
void.class) }
)
i
sv
pu
Verdadero.
Falso.
campusvirtual.cualifica2.es
97 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Recuerda
[[[Elemento Multimedia]]]
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
98 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Autoevaluación
Esta propiedad indica a Hibernate como generar el SQL apropiado para la base de
datos elegida.
es
Esta propiedad indica a Hibernate como generar el código Java apropiado para la base
2.
de datos elegida.
ca
Ninguna de las anteriores es correcta.
lifi
ua
Indica si el siguiente enunciado es verdadero o falso: Hibernate únicamente
utiliza ficheros xml para el mapeado de clases.
l.c
ua
Falso
irt
Verdadero
sv
pu
Trata los objetos Java de la misma manera que SQL trata las tablas.
campusvirtual.cualifica2.es
99 / 100
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096118] HIBERNATE.
Falso
Verdadero
es
2.
En Hibernate, ¿cuál de los siguientes métodos es usado para guardar un
modelo?
ca
lifi
Session.keep() ua
Session.store()
l.c
ua
Session.save()
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
100 / 100