0% encontró este documento útil (0 votos)
137 vistas100 páginas

HIBERNATE

Este documento presenta una introducción a Hibernate, un framework ORM para Java que mapea objetos de Java a tablas de una base de datos relacional. Explica que Hibernate facilita el mapeo entre objetos y tablas, permite consultar la base de datos usando HQL, y soporta varias bases de datos y tecnologías. También describe brevemente la arquitectura de Hibernate y algunas de sus clases principales.

Cargado por

AmadorSalami10
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
137 vistas100 páginas

HIBERNATE

Este documento presenta una introducción a Hibernate, un framework ORM para Java que mapea objetos de Java a tablas de una base de datos relacional. Explica que Hibernate facilita el mapeo entre objetos y tablas, permite consultar la base de datos usando HQL, y soporta varias bases de datos y tecnologías. También describe brevemente la arquitectura de Hibernate y algunas de sus clases principales.

Cargado por

AmadorSalami10
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 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.

Introducción

En este tema veremos clases mapeadas y optimización de mapeo asociados así como de qué manera

podemos lanzar consultas contra la base de datos y optimizar nuestro trabajo.

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

Conocer en qué consiste Hibernate.

Consultar y mapear herencias y clases.

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

anotaciones en los POJO.

Características

es
2.
ca
lifi
ua
l.c
ua
rt

¿Por qué integrar Hibernate en la capa de datos (modelos)?


i
sv

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

entre estos dos paradigmas.

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

permite usar cualquier base de datos que utilice el lenguaje SQL.

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

desplegarla en cualquier servidor de aplicaciones que soporte las especificaciones JEE5.

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

que ofrece Hibernate.


ua
l.c
ua
irt
sv
pu
m
ca

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

Microsoft SQL Server Database


pu

Sybase SQL Server

Informix Dynamic Server


m
ca

Tecnologías soportadas

Hibernate soporta una variedad de otras tecnologías, incluyendo las siguientes:

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:

El objeto Configuration es el primer objeto que se crea en cualquier aplicación de Hibernate y

normalmente se crea sólo una vez durante la inicialización de la aplicación. Representa un archivo

de configuración o propiedades requerido por Hibernate. El objeto Configuration proporciona dos

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.

Se maneja a través de uno o más archivos de configuración


Conexión de base de datos compatibles con Hibernate. Estos archivos son hibernate.properties y
hibernate.cfg.xml
Configuración de mapeado Este componente crea la conexión entre las clases Java y las tablas de
de clases base de datos.

Objeto SessionFactory:

El objeto de configuración se utiliza para crear un objeto SessionFactory que inturn configura

Hibernate para la aplicación utilizando el archivo de configuración suministrado y permite que un

es
objeto Session sea instanciado. SessionFactory es un objeto de seguridad de subproceso y utilizado

por todos los subprocesos de una aplicación.

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

que crear varios objetos SessionFactory.


ua
Objeto Session:
l.c

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

admite la funcionalidad de transacciones. Las transacciones en Hibernate son manejadas por un

gestor de transacciones subyacente. Este es un objeto opcional y las aplicaciones de Hibernate

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

También podemos generar la configuración desde el código:


rt

Configuration cfg = new Configuration()


.addClass(org.hibernate.auction.Item.class)
i
sv

.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

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ej</property>
<property name="hibernate.connection.username">usuario</property>
<property name="hibernate.connection.password">ejemplo</property>
<mapping resource="person.hbm.xml"/>
</session-factory>
</hibernate-configuration>

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

documentación de hibernate se puede encontrar un listado completo para las

propiedades hibernate.dialect e hibernate.connection.driver_class. También se puede ver una

etiqueta <mapping> que indica con un atributo resource un fichero XML que mapea una clase

Java a una tabla de la base de datos.

La razón de usar Hibernate reside en que cuando creamos una aplicación la

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.

Todas las clases con persistencia necesitan un constructor por defecto.

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

los métodos getXXX y setXXX definidos en el estilo JavaBean.

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

anotaciones sobre la clase.


i
sv

Por ejemplo partimos de la siguiente clase POJO, debemos recordar que es imprescindible tener un
pu

constructor sin argumentos:


m

public class Person {


private int id;
ca

private String name;


private String lastName;
private String address;

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.

public String getName() {


return name;
}
public void setName( String name ) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public String getAddress() {
return address;

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

<?xml version="1.0" encoding="utf-8"?>


<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
rt

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
i
sv

<hibernate-mapping>
<class name="Person" table="PERSON">
<meta attribute="class-description">
pu

Esta tabla contiene los datos de una persona


</meta>
<id name="id" type="int" column="id">
m

<generator class="native"/>
</id>
ca

<property name="firstName" column="name" type="string"/>


<property name="lastName" column="last_name" type="string"/>
<property name="address" column="address" type="string"/>
</class>
</hibernate-mapping>

La ruta a este fichero de mapeado debe estar definido en la configuración de Hibernate mediante la

etiqueta <mapping>, por ejemplo <mapping resource="org/test/clients/Person.hbm.xml"/>.

Algunos elementos de mapeado usados en ficheros hbm.xml:

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

tabla de la base de datos se especifica utilizando el atributo table.

< hibernate-mapping >< class >< class >El elemento <meta> es opcional y se puede usar

para definir la descripción de clase.

< 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

a la columna de la tabla de la base de datos. El atributo type tiene el tipo de correlación de

Hibernate, este tipo de asignación se convertirá de Java a SQL.


i rt
sv

Hay otros elementos y atributos usados en la definición de mapeos disponibles en la documentación.


pu

Anotaciones
m

Hasta ahora hemos visto cómo definir el mapeo de clases a tablas mediante documentos xml, pero
ca

también disponemos de la posibilidad de utilizar anotaciones.

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

código, lo que ayuda al desarrollador a entender la estructura de la tabla y la clase simultáneamente

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.

recomienda el mapeo basado en XML.

Usando anotaciones la clase POJO anterior quedaria asi:

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

public void setId( int id ) {


this.id = id;
}
rt

public String getName() {


return name;
i

}
sv

public void setName( String name ) {


this.name = name;
}
pu

public String getLastName() {


return lastName;
}
m

public void setLastName( String last_name ) {


this.lastName = last_name;
ca

}
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

propiedades y otros con getters.

@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á

automáticamente la estrategia de generación de claves primarias más apropiada que se va a utilizar,


ua
pero puede anularla aplicando la anotación @GeneratedValue que toma dos parámetros de
l.c

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

atributos más utilizados:


pu

-name permite que el nombre de la columna se especifique explícitamente.


m

-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.

Consultas contra la base de datos.

El lenguaje utilizado para llevar a cabo consultas con Hibernate se llama HQL o Hibernate Query

Language, es muy similar al ya conocido SQL.

Para la realización de consultas se utiliza la clase Query. Esta nos permite introducir en su método

createQuery() directamente la consulta. Por ejemplo:

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

embargo no es recomendable y se debería utilizar lo menos posible para evitar problemas de

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

propiedades de tabla y nombres de columnas sí.

Algunos ejemplos más:

También podemos usar el nombre completo de una clase, es decir incluyendo la jerarquía de

paquetes que la contienen:

String hql = "FROM com.hibernatebook.criteria.Employee";

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

String hql = "SELECT E.lastName FROM Person P";

Query query = session.createQuery(hql);


ua

List results = query.list();


rt

En el ejemplo anterior "firstName" es el nombre de la propiedad en la clase, y no del atributo en la


i
sv

tabla.
pu

La cláusula WHERE, como en SQL nos permite definir condiciones en la selección, las

expresiones sobre condiciones son como SQL:


m
ca

String hql = "FROM Person E WHERE E.id = 10";

Query query = session.createQuery(hql);

List results = query.list();

ORDER BY nos permite definir el orden de los resultados:

String hql = "FROM Employee E WHERE E.id > 10 " +

"ORDER BY E.firstName DESC, E.salary DESC ";

Query query = session.createQuery(hql);

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.

List results = query.list();

GROUP BY para agrupar en base al mismo valor de un atributo:

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +

"GROUP BY E.firstName";

Query query = session.createQuery(hql);

List results = query.list();

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

consulta definimos la variable precedida por dos puntos :<nombre parámetro>:

ca
lifi
String hql = "DELETE FROM Employee " +

"WHERE id = :employee_id";
ua
Query query = session.createQuery(hql);

query.setParameter("employee_id", 10);
l.c

int result = query.executeUpdate();


ua

System.out.println("Rows affected: " + result);


rt

También podemos utilizar la cláusula INSERT:


i
sv

String hql = "INSERT INTO Employee(firstName, lastName, salary)" +


pu

"SELECT firstName, lastName, salary FROM old_employee";

Query query = session.createQuery(hql);


m

int result = query.executeUpdate();


ca

System.out.println("Rows affected: " + result);

También disponemos de los métodos avg, count, max, min y sum.

Un detalle importante es que para la paginación tenemos dos funciones de la clase Query,

setFirstResult(int startPosition) para el offset y setMaxResults(int maxResults) para el

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.

String hql = "FROM Employee";

Query query = session.createQuery(hql);

query.setFirstResult(1);

query.setMaxResults(10);

List results = query.list();

Sentencias de definición de la estructura de datos

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

| [DEFAULT] COLLATE collation_name


ua

ALTER DATABASE le permite cambiar las características globales de una base de datos. Estas
rt

características se almacenan en el fichero db.opt en el directorio de la base de datos. Para usar


i

ALTER DATABASE, necesita el permiso ALTER en la base de datos.


sv

La cláusula CHARACTER SET cambia el conjunto de caracteres por defecto de la base de datos. La
pu

cláusula COLLATE cambia la colación por defecto de la base de datos.


m

En MySQL 5.0, el nombre de base de datos puede omitirse. El comando se aplica a la base de datos
ca

por defecto. ALTER SCHEMA puede usarse desde MySQL 5.0.2.

Sintaxis de ALTER TABLE

ALTER [IGNORE] TABLE tbl_name

alter_specification [, alter_specification] ...

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.

ADD [COLUMN] column_definition [FIRST AFTER col_name ]

|ADD [COLUMN] (column_definition,... )

|ADD INDEX [index_name] [index_type] (index_col_name,...)

|ADD [CONSTRAINT [symbol]]

PRIMARY KEY [index_type] (index_col_name,...)

es
| ADD [CONSTRAINT [symbol]]

2.
UNIQUE [index_name] [index_type] (index_col_name,...)

ca
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)

| ADD [CONSTRAINT [symbol]]


lifi
ua
FOREIGN KEY [index_name] (index_col_name,...)
l.c

[reference_definition]
ua

| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}


irt

| CHANGE [COLUMN] old_col_name column_definition


sv

[FIRST|AFTER col_name]
pu

| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]


m
ca

| DROP [COLUMN] col_name

| DROP PRIMARY KEY

| DROP INDEX index_name

| DROP FOREIGN KEY fk_symbol

| 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.

| RENAME [TO] new_tbl_name

| ORDER BY col_name

| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_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

almacenamiento no soporte la operación. Estas advertencias pueden mostrarse con SHOW

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

lenta del proceso de alteración) mediante la variable de sistema myisam_sort_buffer_size poniendo

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

mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;


pu

- CHANGE col_name, DROP col_name,y DROP INDEX son extensiones MySQL al estándar SQL.
m

- MODIFY es una extensión de Oracle a ALTER TABLE.


ca

- La palabra COLUMN es opcional y puede omitirse.

- Si usa ALTER TABLE tbl_name RENAME TO new_tbl_name sin ninguna otra opción, MySQL

simplemente renombra cualquier fichero que se corresponda a la tabla tbl_name. No es necesario

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

renombrar una columna INTEGER de a a b, puede hacer:

mysql> ALTER TABLE t1 CHANGE a b INTEGER;

Si quiere cambiar el tipo de una columna pero no el nombre, la sintaxis CHANGE necesita un

nombre viejo y nuevo de columna, incluso si son iguales. Por ejemplo:

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

de columna existentes al nuevo tipo lo mejor posible.


rt

- 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

operaciones CHANGE o MODIFY en MySQL 5.0.


m

- 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.

- DROP INDEX borra un índice. Es una extensión MySQL al estándar SQL.

- 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

tabla, use DROP TABLE .

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

primaria daría lugar a un error.

- 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

aplicaciones que crean tablas con referencias.


ca

- En MySQL 5.0, InnoDB soporta el uso de ALTER TABLE para borrar claves foráneas:

ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;

- ALTER TABLE ignora las opciones DATA DIRECTORY y INDEX DIRECTORY.

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:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

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:

ALTER TABLE ti CHANGE ci ci BLOB;

ALTER TABLE ti CHANGE ci ci TEXT CHARACTER SET utf8;

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

las columnas no tendrán un conjunto de caracteres y que siguientes operaciones CONVERT TO no se


ua
les aplicarán.
l.c

Para solo cambiar el conjunto de caracteres por defecto de una tabla, use este comando:
ua

ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;


rt

La palabra DEFAULT es opcional. El conjunto de caracteres por defecto es el que se usa si no


i
sv

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:

ALTER TABLE tbl_name DISCARD TABLESPACE;

Esto borra el fichero .ibd actual, así que asegúrese que tiene primero una copia de seguridad. Tratar

de acceder a la tabla mientras se descarta el fichero provoca un error.

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.

la base de datos, luego realice el comando:

ALTER TABLE tbl name IMPORT TABLESPACE;

- Con la función mysql_info() de la API de C, puede consultar el número de registros copiados, y

(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

para cambiar la columna b desde CHAR(10) a CHAR(20) así como dejarla de b a c:


ua

mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);


rt

Para añadir una nueva columna TIMESTAMP llamada d:


i
sv

mysql> ALTER TABLE t2 ADD d TIMESTAMP;


pu

Para añadir índices en las columnas d y a:


m

mysql> ALTER TABLE t2 ADD INDEX (d), ADD INDEX (a);


ca

Para borrar la columna c:

mysql> ALTER TABLE t2 DROP COLUMN c;

Para añadir una nueva columna entera AUTO_INCREMENT llamada c:

mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,

-> ADD PRIMARY KEY (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

primara no pueden ser NULL.

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

SET INSERT_ID=value antes de ALTER TABLE o usando la opción de tabla

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,

no se da ningún mensaje de error y el valor de secuencia actual no se cambia.

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

AUTO_INCREMENT los números se resecuencian comenzando en 1.


ua

Sintaxis de CREATE DATABASE


rt

CREATE {DATABASE SCHEMA} [IF NOT EXISTS] db_name


i
sv

[create_specification [, create_specification] ...]


pu

create_specification:
m

[DEFAULT] CHARACTER SET charset_name


ca

| [DEFAULT] COLLATE collation_name

CREATE DATABASE crea una base de datos con el nombre dado. Para usar CREATE DATABASE,

necesita el permiso CREATE en la base de datos.

Ocurre un error si la base de datos existe y no especifica IF NOT EXISTS.

En MySQL 5.0, las opciones create_specification pueden darse para especificar característica de la

base de datos. Las características se almacenan en el fichero db.opt en el directorio de la base de

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

datos. La cláusula COLLATE especifica la colación por defecto de la base de datos.

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

directorio de datos de MySQL y el fichero db.opt file.

es
Si crea manualmente un directorio bajo el directorio de datos (por ejemplo, con mkdir), el servidor lo

considera como un directorio de base de datos y muestra la salida de SHOW DATABASES.

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

CREATE [UNIQUEIFULLTEXTISPATIAL] INDEX index_name


l.c
ua

[USING index_type]
rt

ON tbl_name (index_col_name,...)
i
sv

index_col_name:
pu

col_name [( length)] [ASC | DESC]


m

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

índice se forman al concatenar los valores de las columnas dadas.

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

caracteres de cada valor de la columna. BLOB

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.

t TEXT pueden indexarse, pero se debe dar una longitud de prefijo.

El comando mostrado aquí crea un índice usando los primeros 10 caracteres de la columna name:

CREATE INDEX part_of_name ON customer (name(10));

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

extensiones futuras para especificar almacenamiento de índice ascendente o descendente.


ua

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

tipos de índice, el primero es el tipo por defecto cuando no se especifica index_type.


ca

Ejemplo:

CREATE TABLE lookup (id INT) ENGINE = MEMORY;

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.

CREATE INDEX id_index USING BTREE ON lookup (id);

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 [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name


ua

[(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

base de datos actual o si la base de datos no existe.


m

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

ejemplo, 'mydb'.'mytbl' es legal, pero 'mydb.mytbl' no.

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.

crear tablas temporales.

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

de NULL (recomendado) o 0 en una columna AUTO_INCREMENT autoindexada, la columna se


rt

asigna al siguiente valor de secuencia. Típicamente esto es value+1, donde value es el mayor valor
i

posible para la columna en la tabla. Secuencias AUTO_INCREMENT comienzan con 1. Tales


sv

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

En MySQL 5.0, especificar NO_AUTO_VALUE_ON_ZERO para la opción de servidor --sql-mode o la


ca

variable de sistema sql_mode le permite almacenar 0 en columnas AUTO_INCREMENT como 0 sin

generar un nuevo valor de secuencia.

Nota: Solo puede haber una columna AUTO_INCREMENT por tabla, debe estar indexada, y no puede

tener un valor DEFAULT . Una columna AUTO_INCREMENT funciona correctamente solo si

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

“cambian” de positivos a negativos y asegura que no obtiene accidentalmente una columna

AUTO_INCREMENT que contenga 0.

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

clave de múltiples columnas.

Para hacer MySQL compatible con otras aplicaciones ODBC, puede encontrar el valor

AUTO_INCREMENT para el último registro insertado con la siguiente consulta:

SELECT FROM tbl_name WHERE auto_col IS NULL

- 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

NOW() o CURRENT_DATE. La excepción es que pude especificar CU- RRENT_TIMESTAMP como

defecto para columnas TIMESTAMP.


irt
sv

Antes de MySQL 5.0.2, si una definición de columna no incluye valor DEFAULT explícito, MySQL

determina el valor por defecto como sigue:


pu

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

defecto implícitos se definen como sigue:

- 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

valor por defecto es el primer valor de la enumeración.

Las columnas BLOB y TEXT no pueden tener un valor por defecto.

Desde MySQL 5.0.2, si una definición de columna no incluye valor DEFAULT explícito , MySQL

determina el valor por defecto como sigue:

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

tipo de datos de la columna.


ua

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

siguientes de un comando de múltiples registros, los registros precedentes se insertarán.


pu

Suponga que una tabla t se define como sigue:


m

CREATE TABLE t (i INT NOT NULL);


ca

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,

pero la tercera falla ya que DEFAULT(i) no puede producir un valor:

INSERT INTO t VALUES();

INSERT INTO t VALUES(DEFAULT);

INSERT INTO t VALUES(DEFAULT(i));

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

tener una cláusula explícita DEFAULT.

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

compatibilidad con otros sistemas de bases de datos.

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

indexada le permita un único NULL.


ua

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

tenga columnas NULL como la PRIMARY KEY.


m

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

y también detectar más rápido claves UNIQUE duplicadas.

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

KEY(index_col_name, ...) separada.

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.

referirse a la columna como _rowid en comandos SELECT.

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.

A partir de MySQL 5.0, algunos motores de almacenamiento le permiten especificar un tipo de

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

este puede hacer el fichero de índice mucho más pequeño.


ua

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

CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));


pu

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

columna que use un conjunto de caracteres multi-byte .

Una especificación index_col_name puede acabar con ASC o DESC. Estas palabras clave se permiten

para extensiones futuras para especificar almacenamiento de índices ascendente o

descendentemente. Actualmente se parsean pero se ignoran; los valores de índice siempre se

almacenan en orden ascendente.

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

se soporta y cualquier longitud de prefijo se ignora.

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

se ignora en todos los motores de almacenamiento.


pu

Para tablas MyISAM cada columna NULL ocupa un bit extra, redondeado al byte más próximo. La

máxima longitud de registro en bytes puede calcularse como sigue:


m
ca

row length = 1

+ (sum of column lengths)

+ (number of NULL columns + delete_flag + 7)/8

+ (number of variable-length columns)

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.

que el flag se almacena en una cabecera de registro dinámica.

Estos cálculos no se aplican en tablas InnoDB , en las que el tamaño de almacenamiento no es

distinto para columnas NULL y NOT NULL .

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

transaccionales en el maestro pero tablas no transaccionales en el esclavo (para tener más

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

que se indique lo contrario:

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

tablas grandes con registros de longitud variable.


ua

Cuando crea una tabla MyISAM , MySQL usa el producto de las opciones MAX_ROWS y
rt

AVG_ROW_LENGTH para decidir el tamaño de la tabla resultante. Si no las especifica, el tamaño


i
sv

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

tamaño de puntero por defecto cambiando esta variable.

[DEFAULT] CHARACTER SET

Especifica el conjunto de caracteres para la tabla. CHARSET es un sinónimo. para CHARACTER

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

Especifica la colación por defecto de la tabla.

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

Mínimo número de registros que planea almacenar en la tabla.


i
sv

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

CHAR/VARCHAR largas (MyISAM y ISAM solo).

Si no usa PACK_KEYS, por defecto se comprimen solo cadenas, no números. Si usa PACK_KEYS = 1,

también se empaquetan números.

Al comprimir claves de números binarios, MySQL usa compresión de prefijo:

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.

El puntero al registro se almacena en orden de el-mayor-byte-primero directamente tras la clave,

para mejorar la compresión.

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

si una clave es NULL.)

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

variable. myisampack cambia el tipo a COMPRESSED.


m
ca

Desde MySQL/InnoDB-5.0.3, los registros de InnoDB se almacenan de forma más compacta

(ROW_FORMAT=COMPACT) por defecto. El antiguo formato puede usarse especificando

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

datos que la tabla MERGE. Esta restricción se ha eliminado.)

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

debe tener una llamada realpath() que funcione bien.


i
sv

En MySQL 5.0, puede crear una tabla de otra añadiendo un comando SELECT al final del comando
pu

CREATE TABLE :
m

CREATE TABLE new_tbl SELECT * FROM orig_tbl;


ca

MySQL crea nuevas columnas para todos los elementos en un SELECT. Por ejemplo:

mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,

-> PRIMARY KEY (a), KEY(b))

-> TYPE=MyISAM SELECT b,c FROM test2;

Esto crea una tabla MyISAM con tres columnas, a, b, y c. Tenga en cuenta que las columnas para el

comando SELECT se añaden a la derecha de la tabla, no se sobreescriben en la misma. Consulte 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

antes del comando SELECT :


i
sv

mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;


pu

Algunas conversiones de tipos de columnas pueden ocurrir. Por ejemplo, el atributo


m

AUTO_INCREMENT no se preserva, y las columnas VARCHAR pueden ser CHAR.


ca

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.

CREATE TABLE artists_and_works

SELECT artist.name, COUNT(work.artist_id) AS number_of_works

FROM artist LEFT JOIN work ON artist.id = work.artist_id

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;

Puede especificar explícitamente el tipo de una columna generada:

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

cualquier atributo de columna e índice definido en la tabla original:

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

IGNORE ni REPLACE se indican, los valores únicos duplicados dan un error.


l.c
ua

Para asegurar que el log de update o binario puede usarse para recrear tablas originales, MySQL no

permite inserciones concurrentes durante CREATE TABLE ... SELECT.


rt

Sintaxis de DROP DATABASE


i
sv

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name


pu

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.

IF EXISTS se usa para evitar un error si la base de datos no existe.

DROP SCHEMA puede usarse desde MySQL 5.0.2.

Si usa DROP DATABASE en una base de datos enlazada simbólicamente, tanto el enlace como la

base de datos se borran.

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.

ficheros .frm borrados.

El comando DROP DATABASE borrar del directorio de base de datos los ficheros y directorios que

MySQL puede crear durante operaciones normales:

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

cualquier fichero restante manualmente y realizar el comando DROP DATABASE de nuevo.


ua

Puede borrar bases de datos con mysqladmin.


irt

Sintaxis de DROP INDEX


sv
pu

DROP INDEX index_name ON tbl_name


m

DROP INDEX borra el índice llamado index_name de la tabla tbl_name. En MySQL 5.0, DROP INDEX

se mapea a comando ALTER TABLE para borrar el índice.


ca

Sintaxis de DROP TABLE

DROP [TEMPORARY] TABLE [IF EXISTS]

tbl_name [, tbl_name] ...

[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

no existente cuando se usa IF EXISTS.

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

ha creado, así que no es necesario.)


ua

Usar TEMPORARY es una buena forma de asegurar que no borra accidentalmente una tabla no
rt

TEMPORARY.
i
sv

Sintaxis de RENAME TABLE


pu

RENAME TABLE tbl_name TO new_tbl_name


m

[, tbl_name2 TO new_tbl_name2] ...


ca

Este comando renombra una o más tablas.

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

reemplazar la tabla existente con la vacía como sigue:

CREATE TABLE new_table (...);

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.

RENAME TABLE old_table TO ba.ckup_ta.ble, new_table TO old_table;

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

ninguna tabla llamada tmp_table):

RENAME TABLE old_table TO tmp_table,

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

moverla de una base de datos a otra:

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

todas las tablas renombradas para devolver todo a su estado original.


i
sv
pu

Sentencias de datos: Select, Insert, Delete, Update

Sintaxis de DELETE
m
ca

Sintaxis para una tabla:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_definition]

[ORDER BY ...]

[LIMIT row_count]

Sintaxis para múltiples tablas:

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.

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tb1_name[.*] [, tbl_name[.*] ...]

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

retorna el número de registros borrados.


ua

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 este comportamiento para tablas InnoDB.

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

realiza incluso para tablas MyISAM.

El comando DELETE soporta los siguientes modificadores:

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

tablas. OPTIMIZE TABLE es más sencillo, pero myisamchk es más rápido.


ua
El modificador QUICK afecta si las hojas del índice es mezclan en operaciones de borrado. DELETE
l.c

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

dejados por los valores borrados se reúsan.


i rt

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

1. Cree una tabla que contenga una columna AUTO_INCREMENT indexada.

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,

y borra el primero (el más viejo).


ua

DELETE FROM somelog


i rt

WHERE user = 'jcole'


sv
pu

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

ORDER BY o LIMIT en un DELETE de múltiples tablas.

La parte table_references lista las tablas involucradas en el join.

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:

DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

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

otras tablas se modifiquen correctamente.


i
sv

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

DELETE t1 FROM test AS t1, test2 WHERE ...


ca

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:

DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...

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 expr [, expr] ...

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

[ WHERE where_condition ] [LIMIT ... ]


ua

HANDLER tbl_name READ { FIRST | NEXT }


rt

[ WHERE where_condition ] [LIMIT ... ]


i
sv

HANDLER tbl_name CLOSE


pu

El comando HANDLER proporciona acceso directo a las interfaces del motor de la tabla. En MySQL

5.0, está disponible para tablas


m
ca

MyISAM y InnoDB .

El comando HANDLER ... OPEN abre una tabla, haciéndola accesible mediante posteriores

comandos HANDLER ... READ .

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.

valores dados y la condición WHERE se cumple. Si tiene un índice de múltiples columnas,

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

en el índice, o para las columnas en el prefijo a la izquierda. Por ejemplo:

HANDLER ... index_name = (col_a_val,col_b_val,col_c_val) ...

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

cumple la condición WHERE .


ua
La tercera sintaxis HANDLER ... READ recibe un registro de la tabla en orden de registro natural
l.c

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

la misma sintaxis que para el comando SELECT.


m

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

identificador 'PRIMARY' entrecomillado:

HANDLER tbl_name READ 'PRIMARY' > (...);

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 ...

NEXT o HANDLER ... PREV .

Hay varias razones para usar la interfaz HANDLER en lugar de comandos SELECT normales:

HANDLER es más rápido que SELECT:

Un objeto de tratamiento de motor de almacenamiento designado se reserva para HANDLER ...

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

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl name [(col name,...)]

VALUES ({expr | DEFAULT},...),(...),...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

O:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

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

SET col_na.me={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

O:

INSERT [LOW_PRIORITY HIGH_PRIORITY] [IGNORE]

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

proporciona valores pueden especificarse como sigue:


i rt

La lista de nombres de columna o la cláusula SET indican las columnas explícitamente.


sv

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

orden de las columnas en la tabla, use DESCRIBE tbl_name para encontrarlo.


ca

Los valores de columna pueden darse de distintos modos:

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

expresiones para producir un valor por defecto de una columna.

es
Si la lista de columnas y la lista VALUES están vacías, INSERT crea un registro con cada conjunto de

columnas con sus valores por defecto:

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

conversión de tipos si el tipo de la expresión no coincide con el tipo de la columna, y la conversión

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

considera la cadena entera un valor válido.


m
ca

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:

mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

Pero lo siguiente no es legal, ya que el valor para col1 se refiere a col2, que se asigna tras col1:

mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

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.

AUTO_INCREMENT se genera tras otras asignaciones de valores, cualquier referencia a una

columna AUTO_INCREMENT en la asignación retorna un 0.

El comando INSERT soporta los siguientes modificadores:

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

retardados se suspende hasta que la tabla se libera de nuevo.

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

Si especifica HIGH_PRIORITY, deshabilita el efecto de la opción --low-priority-updates si el servidor


rt

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

conversiones de datos dispararían errores y abortarían el comando si no se especificara IGNORE .

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

de C cuántos registros se insertan realmente en la tabla.

Si especifica ON DUPLICATE KEY UPDATE, y se inserta un registro que duplicaría un valor en un

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:

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)

-> ON DUPLICATE KEY UPDATE c=c+1;

mysql> UPDATE table SET c=c+1 WHERE a=1;

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,

VALUES(col_name) en la cláusula UPDATE se refiere al valor de col_name que se insertarían, no


i
sv

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

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)

-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

Este comando es idéntico a los siguientes dos comandos:

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)

-> ON DUPLICATE KEY UPDATE c=3;

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.

mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)

-> ON DUPLICATE KEY UPDATE c=9;

Cuando usa ON DUPLICATE KEY UPDATE, la opción DELAYED se ignora.

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

cuenta que las dos funciones no siempre se comportan idénticamente.

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

fueron problemáticos por algo.


rt

Las advertencias pueden ocurrir bajo cualquiera de las siguientes condiciones:


i
sv

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

de eso, el comando falla con un error.)

Poner en una columna numérica un valor fuera del rango de la columna. El valor se redondea al

punto final del rango más cercano.

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

máxima longitud de la columna. El valor se trunca a la máxima longitud de la columna.

Insertar un valor en una columna de fecha u hora que es ilegal para el tipo de la columna. La

columna se asigna con el valor cero apropiado para el tipo.

Si usa la API de C, la cadena de información puede obtenerse invocando la función mysql_info()

es
Sintaxis de INSERT ... SELECT

2.
ca
INSERT [LOW_PRIORITY HIGH_PRIORITY] [IGNORE]

lifi
[INTO] tb1_name [(col_name,...)]
ua
SELECT ...
l.c

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]


ua

Con INSERT ... SELECT, puede insertar rápidamente varios registros en un atabla desde una o

varias tablas.
i rt

Por ejemplo:
sv

INSERT INTO tbl_temp2 (fld_id)


pu

SELECT tbl_temp1.fld_order_id
m
ca

FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

La siguiente condición sirve para un comando INSERT ... SELECT :

En MySQL 5.0, especifique IGNORE explícitamente para ignorar registros que causarían violaciones

de clave duplicada.

No use DELAYED con INSERT ... SELECT.

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.)

Las columnas AUTO_INCREMENT funcionan normalmente.

Para asegurar que el log binario puede usarse para recrear las tablas originales, MySQL no permite

inserciones concurrentes durante INSERT ... SELECT.

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

antiguos registros en lugar de descartarlos.


l.c

Sintaxis de LOAD DATA INFILE


ua

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'


rt

[REPLACE | IGNORE]
i
sv

INTO TABLE tbl_name


pu

[FIELDS
m
ca

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[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']

[IGNORE number LINES]

[(col_name_or_user_var,...)]

[SET col_name = expr,...)]

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

se usa para interpretar la información en el fichero. SET NAMES y el valor de character_set_client


l.c

no afecta la interpretación de la entrada.


ua

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

lentas si el cliente y el servidor soportan el protocolo comprimido.


pu

Si usa LOW_PRIORITY, la ejecución del comando LOAD DATA se retarda hasta que no haya más
m

clientes leyendo de la tabla.


ca

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 se especifica LOCAL, se interpreta respecto al cliente final de la conexión:

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.

ruta relativa, el fichero se interpreta relativo al directorio en el que el cliente se inició.

Si no se especifica LOCAL , el fichero tiene que estar en el equipo servidor y el servidor lo lee

directamente.

Al localizar ficheros en el equipo servidor, el servidor usa las siguientes reglas:

Si se da una ruta absoluta, el servidor usa la ruta como tal.

es
Si se da una ruta relativa con uno o más componentes, el servidor busca este fichero relativo al

directorio de datos del servidor.

2.
ca
Si se da un nombre de fichero sin ninguna ruta, el servidor busca el fichero en el directorio de base

de datos de la base de datos por defecto.

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

mysql> USE db1;


pu

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;


m

Tenga en cuenta que las rutas de windows se especifican usando barras en lugar de antibarras. Si

usa barras, debe doblarlas.


ca

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

DATA INFILE en ficheros del servidor, debe tener el permiso FILE .

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

necesita el permiso FILE para cargar ficheros locales.

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

mysqld se arranca con - -local-infile=0, entonces LOCAL no funciona.

Si necesita LOAD DATA para leer desde un pipe, puede usar la siguiente técnica (aquí cargamos el

listado del directorio / en una tabla):

mkfifo /mysql/db/x/x

chmod 666 /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

registros existentes en claves únicas.


ua
Si especifica REPLACE, los registros de entrada reemplazan registros existentes (en otras palabras,
l.c

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

única se ignoran. Si no especifica ninguna opción, el comportamiento depende de si la palabra

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

transmisión del fichero en medio de la operación.


m

Si quiere ignorar restricciones de clave foránea durante la operación de carga, puede realizar un
ca

comando SET FO- REIGN_KEY_CHECKS = 0 antes de ejecutar LOAD DATA.

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

tras cargar el fichero.

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

son opcionales, pero FIELDS debe preceder a LINES si se especifican 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

Busca delimitadores de línea como nuevas líneas.

No ignora ningún prefijo de línea.


rt

Rompe las líneas en campos con los tabuladores.


i
sv

No espera campos entrecomillados dentro de ningún carácter delimitador.

Interpreta las ocurrencias de tabuladores, nuevas líneas o '\' precedidas por '\' como caracteres
pu

literales que son parte de valores de campos.


m

Por defecto SELECT ... INTO OUTFILE actúa como sigue al escribir la salida:
ca

Escribe tabuladores entre campos.

No entrecomilla los campos.

Usa '\' para escapar las instancias de tabuladores, nuevas líneas o '\' que ocurren entre valores

de campos.

Escribe nuevas líneas al final de las líneas.

Tenga en cuenta que para escribir FIELDS ESCAPED BY '\\', debe escribir dos antibarras para que

se interprete como una única antibarra.

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

Con esto puede leer en un fichero que contenga algo como:


ua

xxx"row",1
rt

something xxx"row",2
i
sv

Y obtener los datos ("row",1) y ("row",2).


pu

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

mysql> LOAD DATA INFILE '/tmp/test.txt'

-> INTO TABLE test IGNORE 1 LINES;

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:

mysql> SELECT INTO OUTFILE 'data.txt'

-> FIELDS TERMINATED BY

-> FROM table2;

Para leer el fichero delimitado por comas, el comando correcto sería:

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

-> FIELDS TERMINATED BY '\t';


ua

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

opciones de campo y línea que debería usar para cargar el fichero:


m

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name


ca

-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'

-> LINES TERMINATED BY '\n';

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

líneas, especifique una cláusula LINES TERMINATED BY '\r\n' .

Para leer un fichero que contenga bromas separadas por líneas consistentes de %%, puede hacer lo

siguiente

mysql> CREATE TABLE jokes

-> (a INT NOT NULL AUTO INCREMENT PRIMARY KEY,

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

FIELDS [OPTIONALLY] ENCLOSED BY controla el entrecomillado de los campos. Para la salida

(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

"2","a string containing a , comma","102.20"


m

"3","a string containing a \" quote","102.20"


ca

"4","a string containing a \", quote and comma","102.20"

Si especifica OPTIONALLY, el carácter ENCLOSED BY se usa solo para delimitar valores en

columnas que tienen datos de cadenas (tales como CHAR, BINARY, TEXT, o ENUM):

1,"a string",100.20

2,"a string containing a , comma",102.20

3,"a string containing a \" quote",102.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.

4,"a string containing a \", quote and comma",102.20

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

delimitación, que (erróneamente) parece que termine el campo:

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

campos. (Esto es cierto se especifique OPTIONALLY o no; OPTIONALLY no tiene efecto en la


ua

interpretación de la entrada.) Las ocurrencias del carácter ENCLOSED BY precedidas por el

carácter ESCAPED BY se interpretan como parte del campo actual.


irt
sv

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

ENCLOSED BY, la delimitación se trata como se muestra aquí:


ca

"The ""BIG"" boss" -> The "BIG" boss

The "BIG" boss -> The "BIG" boss

The ""BIG"" boss -> The ""BIG"" boss

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.

- El carácter FIELDS ESCAPED BY

- El carácter FIELDS [OPTIONALLY] ENCLOSED BY

- El primer carácter de los valores FIELDS TERMINATED BY y LINES TERMINATED BY

- ASCII 0 (lo que realmente se escribe a continuación del carácter de escape es '0' en ASCCI, no un

byte con valor cero)

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

En ciertos casos, las opciones de tratamiento de campos y línea interactúan:


i rt
sv

- Si LINES TERMINATED BY es una cadena vacío y FIELDS TERMINATED BY no está vacío, las

líneas se terminan con FIELDS TERMINATED BY.


pu

- 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

valores para la columna se obtienen leyendo siete caracteres.

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

conjunto de caracteres multi byte.

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

entrada se lee como NULL (considerando que el carácter ESCAPED BY es '\').

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

BY, que se lee como la cadena 'NULL'.

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

fichero, no debe usar el formato de registro fijo.


rt

Algunos casos no son soportados por LOAD DATA INFILE:


i
sv

Registros de tamaño fijo (FIELDS TERMINATED BY y FIELDS ENCLOSED BY ambos vacíos) y


pu

columnas BLOB o TEXT


m

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:

FIELDS TERMINATED BY ‘ ‘’ ’ ENCLOSED BY ‘ ‘’ ’

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

puede determinar apropiadamente dónde acaba el campo o línea.

El siguiente ejemplo carga todas las columnas de la tabla persondata:

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.

mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

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:

mysql> LOAD DATA INFILE 'persondata.txt'

-> INTO TABLE persondata (col1,col2,...);

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

los resultados a las columnas.


ua

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

usada por el valor de t2.column2:

LOAD DATA INFILE 'file.txt'


m
ca

INTO TABLE tl

(columnl, @var1)

SET column2 = @var1/100;

La cláusula SET puede usarse para proporcionar valores no derivados del fichero de entrada. Los

siguientes comandos actualizan column3 con la fecha y hora actuales:

LOAD DATA INFILE 'file.txt'

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.

INTO TABLE t1 (column1, column2)

SET column3 = CURRENT_TIMESTAMP;

También puede descartar un valor de entrada asignándolo a una variable de usuario y no asignando

la variable a una columna de tabla:

LOAD DATA INFILE 'file.txt'

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

columnas/variables o por la cláusula SET .


pu

Las variables de usuario no pueden usarse al cargar datos con formato de registro ya que las

variables de usuario no tienen un ancho de muestra.


m
ca

Al procesar una línea de entrada, LOAD DATA la divide en campos y usa los valores según la lista de

columnas/ variables y la cláusula SET , si están presentes. A continuación se inserta el registro

resultante en la tabla. Si hay disparadores BEFORE INSERT o AFTER INSERT para la tabla, se

activan antes o después de insertar el registro, respectivamente.

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

adquieren su valor por defecto.

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 cadenas, la columna adquiere la cadena vacía.

Para tipos numéricos, la columna recibe el valor 0.

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

cadena de caracteres, numérico o de fecha u hora en un comando INSERT o UPDATE statement.

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 .

Todos los valores ENUM y SET deben especificarse como cadenas.


l.c

Cuando acaba el comando LOAD DATA INFILE, retorna una cadena de información con el siguiente
ua

formato:
rt

Records: 1 Deleted: 0 Skipped: 0 Warnings: 0


i
sv

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

max_error_count advertencias como información acerca de qué ha fallado.

Sintaxis de REPLACE

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name [(col_name,...)]

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.

VALUES ({expr | DEFAULT},...),(...),...

O:

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name

SET col_name={expr | DEFAULT}, ...

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

antes de insertar el nuevo.


rt

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

si un nuevo registro duplica otro.


pu

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

SET col_name = col_name + 1, la referencia al nombre de columna en la parte derecha se trata

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

registros borrados e insertados. Si el contador es 1 para REPLACE de un único registro, se inserta

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

registros antiguos en distintos índices únicos.

El contador de registros afectados hace fácil determinar si REPLACE solo añadió un registro o si

también reemplazo alguno: Compruebe si el contador es 1 (añadido) o mayor (reemplazados).

Si usa la API de C, el contador de registros afectados puede obtenerse usando la función

mysql_affected_rows() . Actualmente, no puede reemplazar en una tabla y seleccionar de la misma

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

B- Intenta insertar de nuevo el registro en la tabla


ua

Sintaxis de SELECT
rt

SELECT
i
sv

[ALL | DISTINCT | DISTINCTROW ]


pu

[HIGH_PRIORITY]
m

[STRAIGHT_JOIN]
ca

[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]

[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr, ...

[INTO OUTFILE 'file_name' export_options

| INTO DUMPFILE 'file_name']

[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]

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... [WITH ROLLUP]]

[HAVING where_definition]

[ORDER BY {col_name | expr | position}

es
[ASC | DESC] , ...]

2.
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

ca
[PROCEDURE procedure_name(argument_list)]

[FOR UPDATE | LOCK IN SHARE MODE]]


lifi
ua
SELECT se usa para recibir registros seleccionados desde una o más tablas. MySQL 5.0 incluye
l.c

soporte para comandos UNION y subconsultas.


ua

- Cada select_expr indicaba una columna que quiere recibir.


rt

- table_references indicaba la tabla o tablas desde la que recibir registros.


i
sv

- 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:

mysql> SELECT 1+1;

-> 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

cualquier cláusula ORDER BY .

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:

mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name

-> FROM mytable ORDER BY full_name;

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

comando, columnb se tata como un nombre de alias:


l.c
ua

mysql> SELECT columna columnb FROM mytable;


rt

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

no estar determinado cuando se ejecuta la cláusula WHERE.


pu

- 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.

tbl_name [[AS] alias]

[[USE INDEX (key_list)]

| [IGNORE INDEX (key_list)]

| [FORCE INDEX (key_list)]]

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

cómo escoger los índices.

En MySQL 5.0, puede usar SET max_seeks_for_key= value como alternativa para forzar a MySQL a

que realice escaneos de claves en lugar de escaneos de tabla.

- 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

necesita especificar un prefijo tbl_name o db_name.tbl_name para una referencia de columna a 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

funciones agregadas (resumen).

- 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:

mysql> SELECT college, region, seed FROM tournament

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 region, seed;

mysql> SELECT college, region AS r, seed AS s FROM tournament

-> ORDER BY r, s;

mysql> SELECT college, region, seed FROM tournament

-> 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

SELECT a, COUNT(b) FROM test_table GROUP BY a DESC


rt

- MySQL extiende el uso de GROUP BY para permitir seleccionar campos que no se mencionan en la
i
sv

cláusula GROUP BY.


pu

- En MySQL 5.0, GROUP BY permite un modificador WITH ROLLUP .


m

- La cláusula HAVING se aplica casi al final, justo antes de que los elementos se envíen al cliente, sin
ca

optimización. (LIMIT se aplica tras HAVING.)

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

comportamiento específico de MySQL en que es capaz de referirse a columnas en la lista SELECT,

MySQL 5.0.2 y posterior permite a HAVING referirse a columnas en la lista SELECT, en la cláusula

GROUP BY , en subconsultas externas y en funciones agregadas.

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:

mysql> SELECT COUNT( ) FROM t GROUP BY coll HAVING coll = 2;

Si la cláusula HAVING se refiere a una columna ambigua, se muestra una advertencia. En el

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

siguiente: mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;


l.c

Escriba esto en su lugar:


ua

mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;


rt

- La cláusula HAVING puede referirse a funciones de agregación, algo que no puede hacer la
i
sv

cláusula WHERE:
pu

mysql> SELECT user, MAX(salary) FROM users


m

-> GROUP BY user HAVING MAX(salary)>10;


ca

(Esto no funciona en versiones antiguas de MySQL.)

- 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

retornar. El desplazamiento del registro inicial es 0 (no 1):

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.

mysql> SELECT FROM table LIMIT 5,10; # Retrieve rows 6-15

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

desde el 96th hasta el último:

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

como /etc/passwd y tablas de la base de datos.


i
sv

El comando SELECT ... INTO OUTFILE existe principalmente para dejarle volcar una tabla
pu

rápidamente en la máquina servidor. Si quiere crear el fichero resultante en un equipo cliente

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

comando LOAD DATA INFILE.

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:

- El carácter FIELDS ESCAPED BY

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.

- El carácter FIELDS [OPTIONALLY] ENCLOSED BY

- El primer carácter de FIELDS TERMINATED BY y LINES TERMINATED BY

- 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

SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'


i
sv

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'


pu

LINES TERMINATED BY '\n'


m

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

quiere almacenar un valor BLOB en un fichero.

- 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

duplicados en el conjunto de resultados deben borrarse.


l.c

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

hay un comando de actualización esperando a que se libere la tabla.


m

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

tablas en orden no óptimo.

- 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

enviar el resultado al cliente.

- 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

- SQL_NO_CACHE le dice a MySQL que no almacene los resultados de consulta en la caché de


ua

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.

Algunas conversiones de tipos de columnas pueden ocurrir. Por ejemplo, el


atributo AUTO_INCREMENT no se preserva, y las columnas VARCHAR pueden ser
CHAR.

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.

Completa las oraciones:


[[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 son opcionales, pero FIELDS debe preceder a LINES si se especifican ambas.

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.

Los mapeos de asociaciones consisten en realizar consultas a asociaciones de los tipos:

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

Mediante anotaciones quedaría así:

@Entity
@Table(name = "PERSONAS")
public class Persona{
//Otras propiedades y metodos
private Set<Dirección> direcciones = new HashSet<Direccion>();

@OneToMany(fetch = FetchType.LAZY, mappedBy = "persona")


public Set<StockDailyRecord> getDirecciones() {
return this.direcciones;
}

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.

public void setDirecciones(Set<StockDailyRecord> direcciones) {


this.direcciones = direcciones;
}

@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

También se puede observar el uso de un parámetro denominado fetch, Fetch.LAZY y


ua

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

en cambio con EAGER se realiza cuando obtenemos el objeto.


i
sv
pu
m
ca

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

reutilizable y la organización de grandes sistemas de información no supongan una tediosa tarea

para los programadores.

Hibernate soporta las tres estrategias básicas de mapeo de herencia:

es
Tabla por jerarquía de clases.

Tabla por subclase.

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

<subclass name="DomesticCat" extends="Cat" discriminator-value="D">


<property name="name" type="string"/>
</subclass>
m

</hibernate-mapping>
ca

Tabla por jerarquía

Supongamos que tenemos una interfaz Payment con las implementaciones CreditCardPayment,

CashPayment y ChequePayment. El mapeado de tabla por jerarquia se definiria de la siguiente

manera:

<class name="Payment" table="PAYMENT">


<id name="id" type="long" column="PAYMENT_ID">

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

declaradas por las subclases no pueden tener restricciones NOT NULL.

Tabla por subclase


lifi
ua
El mapeado de una tabla por subclase se define de esta manera:
l.c
ua

<class name="Payment" table="PAYMENT">


<id name="id" type="long" column="PAYMENT_ID">
<generator class="native"/>
rt

</id>
<property name="amount" column="AMOUNT"/>
i

...
sv

<joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">


<key column="PAYMENT_ID"/>
<property name="creditCardType" column="CCTYPE"/>
pu

...
</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

La implementación de tabla por subclase de Hibernate no requiere una columna discriminadora.

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

<join> y , de la siguiente manera:

<class name="Payment" table="PAYMENT">


<id name="id" type="long" column="PAYMENT_ID">
<generator class="native"/>
</id>
<discriminator column="PAYMENT_TYPE" type="string"/>

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 table="CHEQUE_PAYMENT" fetch="select">


<key column="PAYMENT_ID"/>
...
rt

</join>
</subclass>
i
sv

</class>
pu

Tabla por clase concreta


m

En este caso se crearía una tabla por cada clase hija pero no la tabla padre, es decir las tablas hijas

contienen su propio conjunto de atributos.


ca

<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.

<union-subclass name="ChequePayment" table="CHEQUE_PAYMENT">


...
</union-subclass>
</class>

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

no pueden tener la misma id.

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.

Trabajo con Objetos.

Para recuperar y guardar objetos en Hibernate utilizamos un objeto de Session. Un objeto

Session mantiene una conexión física con la base de datos, está diseñado para ser instanciado cada

vez que se necesita una interacción con la base de datos.

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

Persistente: Se produce cuando el objeto existe en la base de datos y posee un identificador

dentro del ámbito de la Session.


i rt
sv
pu

//.....................
import org.hibernate.HibernateException;
import org.hibernate.Session;
m

import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
ca

public class ManagePersons {


//..................
private static SessionFactory factory;
//...................
public Integer addPerson(String name, String lname){

Session session = factory.openSession();


Transaction tx = null;
Integer ID = null;
try{
tx = session.beginTransaction();
Person person = new Person(name, lname);
ID = (Integer) session.save(person);
tx.commit();

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

el rendimiento o encontrar los posibles problemas.

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

12014439 nanoseconds spent preparing 21 JDBC statements;


5622686 nanoseconds spent executing 21 JDBC statements;
ua

nanoseconds spent executing JDBC batches;


nanoseconds spent performing L2C puts;
nanoseconds spent performing L2C hits;
rt

nanoseconds spent performing L2C misses;


403863 nanoseconds spent executing 1 flushes (flushing a total of 10 entities and collections);
i

25529864 nanoseconds spent executing 1 partial-flushes (flushing a total of 10 entities and 10


sv

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

para ver los resultados bajo una carga significativa.


ca

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

de modelo con la anotación @SqlResultSetMapping.

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.

Elegir el correcto FetchType (LAZY - EAGER)

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

Hibernate posee funciones para realizar un registro de las operaciones realizadas


m

y representar determinadas estadísticas, estas se pueden activar estableciendo el


ca

parámetro de configuración hibernate.generate_statistics a true y


org.hibernate.stat a DEBUG.

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

¿Cuál de las siguientes afirmaciones son verdaderas sobre el atributo


hibernate.dialect en la configuració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

¿Cuál de las siguientes afirmaciones sobre HQL es correcta?


m
ca

Trata los objetos Java de la misma manera que SQL trata las tablas.

HQL es independiente de la base de datos

Todas las anteriores son correctas.

Ninguna de las anteriores.

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.

Indica si el siguiente enunciado es verdadero o falso: Para la creación de clases


mapeadas, tenemos que seguir una serie de reglas las cuales no son necesarias
pero ayudan a que Hibernate pueda reconocerlas.

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

También podría gustarte