<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bibigeek.com &#187; MySQL</title>
	<atom:link href="http://www.bibigeek.com/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bibigeek.com</link>
	<description>Otro blog más de WordPress</description>
	<lastBuildDate>Fri, 28 May 2010 17:11:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Utilizar Configurar Django con MySQL</title>
		<link>http://www.bibigeek.com/2010/02/26/utilizar-configura-django-con-mysql/</link>
		<comments>http://www.bibigeek.com/2010/02/26/utilizar-configura-django-con-mysql/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 20:02:37 +0000</pubDate>
		<dc:creator>bibigeek</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.bibigeek.com/?p=972</guid>
		<description><![CDATA[Hola a tod@s de nuevo,
Al fiiinnnnn, por dos razones importantes:

Una, porque hacia tiempo que no escribía (y mirad que tengo temas, pero también mucho trabajo&#8230;)
Y dos&#8230; ya he podido configurar Django con MySQL. Se me resistía, una y otra vez, todo porque me faltaba instalar python-mysqldb, de lo contario siempre me daba errores.

Voy a dividir [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a tod@s de nuevo,</p>
<p>Al fiiinnnnn, por dos razones importantes:</p>
<ul>
<li>Una, porque hacia tiempo que no escribía (y mirad que tengo temas, pero también mucho trabajo&#8230;)</li>
<li>Y dos&#8230; ya he podido configurar <strong>Django con MySQL</strong>. Se me resistía, una y otra vez, todo porque me faltaba instalar python-mysqldb, de lo contario siempre me daba errores.</li>
</ul>
<p>Voy a dividir la instalación en puntos para que se pueda leer, comprender y que el seguimiento sea lo más simple posible. Empecemos.</p>
<h3>Requisitos necesarios para instalar Django con MySQL</h3>
<ul>
<li>Sistema Operativo Linux (testeado en <em><strong>Ubuntu Karmic Koala</strong></em>), para los Maqueros como en mi caso tendremos que esperar a que pueda hacer pruebas <img src='http://www.bibigeek.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
<li>Versión de Django 1.1.1  instalado (esper que con versiones anteriores o posteriores no tiene porque ser diferente)</li>
<li>Motor de Base de Datos MySQL (versión, yo tengo la 5.1.37) tanto el servidor como el cliente.</li>
<li><strong>(Opcional)</strong> Instalación de MySQL Administrator y MySQL Query Browser</li>
<li>Paquete python-mysqldb (pero se explicará con más detalle)</li>
</ul>
<h3>Instalación MySQL Administrator y MySQL Query Browser</h3>
<p><strong>1-</strong> Primero buscamos el paquete <strong><em>mysql-admin</em></strong> con el siguiente comando:</p>
<pre><code>
sudo aptitude search mysql-admin
</code></pre>
<p><strong>2-</strong> La salida que obtenemos es:</p>
<pre><code>
bibigeek@macbookpro-bibigeek:~/PythonProjects$ sudo aptitude search mysql-admin
pB  mysql-admin               - Herramienta gráfica para una administración sencilla de MySQL
</code></pre>
<p><strong>3-</strong> Ahora ya ponemos a instalar el paquete <strong><em>mysql-admin</em></strong> con el comando:</p>
<pre><code>
sudo aptitude install mysql-admin
</code></pre>
<p><strong>4-</strong> La salida de la instalación es (importante fijaros en el texto en negrita y subrayado):</p>
<pre><code>
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán los siguiente paquetes NUEVOS:
libgnomecups1.0-1{a} libgnomeprint2.2-0{a} libgnomeprint2.2-data{a} libgnomeprintui2.2-0{a} libgnomeprintui2.2-common{a}
libgtkhtml3.8-15{a} libmysqlclient15off{a} <span style="text-decoration: underline;"><strong>mysql-admin mysql-gui-tools-common{a} mysql-query-browser{a} </strong></span>
0 paquetes actualizados, 10 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 0B/6212kB de archivos. Después de desempaquetar se usarán 22,3MB.
¿Quiere continuar? [Y/n/?] y
Escribiendo información de estado extendido... Hecho

Seleccionando el paquete libgnomecups1.0-1 previamente no seleccionado.

...

Configurando mysql-gui-tools-common (5.0r12-1ubuntu2) ...
Configurando mysql-admin (5.0r12-1ubuntu2) ...

Configurando mysql-query-browser (5.0r12-1ubuntu2) ...

Procesando disparadores para libc-bin ...
ldconfig deferred processing now taking place
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Escribiendo información de estado extendido... Hecho
</code></pre>
<p><strong>5- </strong> Pantallazo de donde podemos encontrar los programas instalados:</p>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-19.23.36.jpg"><img class="aligncenter size-full wp-image-979" title="MySQL Administrator - MySQL Query Browser" src="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-19.23.36.jpg" alt="" width="548" height="407" /></a></p>
<h3>Creación del Proyecto testProject</h3>
<p><strong>1-</strong> Ahora creamos el proyecto Django, un proyecto de prueba. Lo denominaré &#8220;testProject&#8221;, ejecutamos el siguiente comando:</p>
<pre><code>
django-admin.py startproject testProject
</code></pre>
<p><strong>2-</strong> Configuraremos el proyecto Django para que funcione con el motor de BD MySQL. Alerta, estoy suponiendo que el usuario test y la Base de Datos testDB está creado. Os adjunto los valores a modificar en el fichero settings.py y también adjunto un pantallazo:</p>
<pre><code>
12 DATABASE_ENGINE = 'mysql'
13 DATABASE_NAME = 'testDB'
14 DATABASE_OPTIONS ={"init_command":"SET storage_engine=INNODB"}
15 DATABASE_USER = 'test'
16 DATABASE_PASSWORD = 'test'
17 DATABASE_HOST = 'localhost'
18 DATABASE_PORT = '3306'
</code></pre>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.09.56.jpg"><img class="aligncenter size-medium wp-image-982" title="Fichero settings.py MySQL" src="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.09.56-300x170.jpg" alt="" width="300" height="170" /></a><br />
<strong><span style="color: #ff0000;">IMPORTANTE:</span></strong> fijaos que he puesto una opción que no viene por defecto el fichero settings.py, que es el <strong>DATABASE_OPTIONS</strong>. Esta opción es utilizada para especificarle a Django que las tablas que tienen que crear en MySQL son de la tecnología <strong>INNODB</strong>.</p>
<p><strong>3-</strong> Ahora ejecutamos el comando <em><strong>&#8220;syncdb&#8221;</strong></em> para crear la estructura de Base de Datos para Django. Veréis por los siguiente pantallazos y textos expuestos, que no funciona y nos mostrara un error. Veamosló todo:</p>
<pre><code>
bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ <em><strong>python manage.py syncdb</strong></em>
Traceback (most recent call last):
File "manage.py", line 11, in &lt;module&gt;
execute_manager(settings)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 362, in execute_manager
utility.execute()
File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 303, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 195, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 221, in execute
self.validate()
File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 249, in validate
num_errors = get_validation_errors(s, app)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/validation.py", line 22, in get_validation_errors
from django.db import models, connection
File "/usr/local/lib/python2.6/dist-packages/django/db/__init__.py", line 41, in &lt;module&gt;
backend = load_backend(settings.DATABASE_ENGINE)
File "/usr/local/lib/python2.6/dist-packages/django/db/__init__.py", line 17, in load_backend
return import_module('.base', 'django.db.backends.%s' % backend_name)
File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/mysql/base.py", line 13, in &lt;module&gt;
raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb
</code></pre>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.10.55.jpg"><img class="aligncenter size-medium wp-image-984" title="Python manage.py syndb" src="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.10.55-300x171.jpg" alt="" width="300" height="171" /></a></p>
<h3>Instalación del paquete Python-mysqldb</h3>
<p>Como habréis notado y visto, cuando hemos ejecutado el syncdb nos ha proporcionado una serie de errores. Esto lo solucionaremos con la instalación del paquete &#8220;python-mysqldb&#8221;. Para instalarlo podemos ejecutar los siguientes comandos y os tendría que aparecer en la salida algo similar a esto:</p>
<pre><code>
bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ <strong>sudo aptitude search python-mysql</strong>
[sudo] password for bibigeek:
p   python-mysqldb                       - Una interfaz Python para MySQL
p   python-mysqldb-dbg              - Una interfaz Python para MySQL (extensión de depuración)

bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ <strong>sudo aptitude install python-mysqldb</strong>
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán los siguiente paquetes NUEVOS:
python-mysqldb
0 paquetes actualizados, 1 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 0B/98,5kB de archivos. Después de desempaquetar se usarán 352kB.
Escribiendo información de estado extendido... Hecho
Seleccionando el paquete python-mysqldb previamente no seleccionado.
(Leyendo la base de datos ...  00%
153203 ficheros y directorios instalados actualmente.)
Desempaquetando python-mysqldb (de .../python-mysqldb_1.2.2-10_i386.deb) ...
Configurando python-mysqldb (1.2.2-10) ...
Procesando disparadores para python-support ...
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Escribiendo información de estado extendido... Hecho
</code></pre>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.15.47.jpg"><img class="aligncenter size-medium wp-image-987" title="Instalacion de python-mysql" src="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.15.47-300x172.jpg" alt="" width="300" height="172" /></a></p>
<h3>Resultado final de Django con MySQL</h3>
<p>1- Si en estos momentos ejecutamos el syncdb tendremos el siguiente resultado (texto y pantallazo):</p>
<pre><code>
bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ <strong>python manage.py syncdb</strong>
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'bibigeek'): demo
E-mail address: bibigeek@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model
</code></pre>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.19.24.jpg"><img class="aligncenter size-medium wp-image-988" title="Ejecución correcta del syncdb" src="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.19.24-300x171.jpg" alt="" width="300" height="171" /></a></p>
<p>Para que podáis comprobar que esta se ha echo realidad (es que al fin lo he podido hacer funcionar&#8230;) os ajunto un pantallazo del MySQL Administrator con el diseño del schema testDB, veamosló:</p>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.40.17.jpg"><img class="aligncenter size-medium wp-image-989" title="MySQL Administrator con las tablas de Django" src="http://www.bibigeek.com/wp-content/uploads/2010/02/Captura-de-pantalla-2010-02-26-a-las-17.40.17-299x179.jpg" alt="" width="299" height="179" /></a>Como habréis visto en la imagen, las tablas creadas son <strong>INNODB</strong>, importante <img src='http://www.bibigeek.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Espero que os haya servido de algo y suerte!!!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bibigeek.com/2010/02/26/utilizar-configura-django-con-mysql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Backup de Base de Datos con mysqldump</title>
		<link>http://www.bibigeek.com/2010/01/06/backup-de-base-de-datos-con-mysqldump/</link>
		<comments>http://www.bibigeek.com/2010/01/06/backup-de-base-de-datos-con-mysqldump/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 23:27:59 +0000</pubDate>
		<dc:creator>bibigeek</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.bibigeek.com/?p=934</guid>
		<description><![CDATA[Hola de nuevo, ya vuelvo a estar con algún que otro consejo.
Copia de Seguridad o Backup con mysqldump
Estos días he tenido que hacer la copia de seguridad de mis Base de Datos de MySQL manualmente y como no&#8230; lo he tenido que hacer con el comando mysqldump (link man mysqldump).
En mi caso he tenido que [...]]]></description>
			<content:encoded><![CDATA[<p>Hola de nuevo, ya vuelvo a estar con algún que otro consejo.</p>
<h3>Copia de Seguridad o Backup con mysqldump</h3>
<p>Estos días he tenido que hacer la copia de seguridad de mis Base de Datos de MySQL manualmente y como no&#8230; lo he tenido que hacer con el comando mysqldump (<a title="Man mysqldump" href="http://www.manpagez.com/man/1/mysqldump/" target="_blank">link man mysqldump</a>).</p>
<p>En mi caso he tenido que hacer el backup de TODAS las Base de Datos que tengo y para ello he ejecutado el siguiente comando:</p>
<pre><code>
<strong>sudo mysqldump -A --password=<em>CLAVE</em> --user=<em>USUARIO</em> &gt; backupDB_5Enero2010.sql</strong>
</code></pre>
<p>Se pueden utilizar varios que otras opciones, por ejemplo:</p>
<p><strong>1. </strong>Copia de Seguridad &#8211; Backup con un comando más simple:</p>
<pre><code>
<strong>sudo mysqldump --opt &gt; salidaBackup.sql</strong>
</code></pre>
<p><strong>2. </strong>Copia de seguridad lo más rápidamente, ejectivamente de una Base de Datos concreta:</p>
<pre><code>
<strong>sudo mysqldump --opt --password=<em>CLAVE</em> --user=<em>USUARIO</em> <em>BASEDATOS</em> &gt; salidaBackup.sql</strong>
</code></pre>
<p><strong>3. </strong>Copia de seguridad de una sola tabla de una Base de Datos:</p>
<pre><code>
<strong>sudo mysqldump --opt --user=<em>USUARIO</em> --password=<em>CLAVE BASEDATOS TABLA</em> &gt; salitaTabla.sql</strong>
</code></pre>
<p>Esto es lo que he podido probar pero se pueden hacer bastantes combinaciones posibles. Ahora veamos como podemos restaurar estas copias de seguridad desde comandos, nuevamente.</p>
<h3>Restaurar Copias de Seguridad Backup con mysqldump</h3>
<p>Al igual que he explicado en la parte superior, podemos hacer la restauración del fichero de distintas maneras y utilizando más o menos parámentros. Veamos los más utilizados:</p>
<p><strong>1. </strong>Comando simple para restaurar un Base de Datos concreta:</p>
<pre><code>
<strong>sudo mysql BASEDATOS &lt; salidaBackup.sql</strong>
</code></pre>
<p><strong>2. </strong>Comando con más parámetros de todos</p>
<pre><code>
<strong>sudo mysql user=<em>USUARIO</em> --password=<em>CLAVE BASEDATOS </em>&lt; salitaTabla.sql</strong>
</code></pre>
<p>Espero que os haya servido de algo!!!! Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bibigeek.com/2010/01/06/backup-de-base-de-datos-con-mysqldump/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL la codificación UTF8 y su cotejamiento&#8230;</title>
		<link>http://www.bibigeek.com/2009/10/05/mysql-la-codificacion-utf8-y-su-cotejamiento/</link>
		<comments>http://www.bibigeek.com/2009/10/05/mysql-la-codificacion-utf8-y-su-cotejamiento/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 06:30:41 +0000</pubDate>
		<dc:creator>bibigeek</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.bibigeek.com/?p=558</guid>
		<description><![CDATA[Hola a tod@s,
Hace unas semanas, cuando tuve que introducirme en el mundo MySQL, me quedaban constantemente dudas y preguntas. He tenido que hacer uso de San Google para que me las pudiera solucionar.
La duda surgía cada vez que tenía que crear una tabla, una campo de una tabla, la base de datos&#8230; ya que había [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a tod@s,</p>
<p>Hace unas semanas, cuando tuve que introducirme en el <em>mundo MySQL</em>, me quedaban constantemente dudas y preguntas. He tenido que hacer uso de <em><strong>San Google</strong></em> para que me las pudiera solucionar.<br />
La duda surgía cada vez que tenía que crear una tabla, una campo de una tabla, la base de datos&#8230; ya que había un campo que no sabía que seleccionar, <strong>EL COTEJAMIENTO</strong> (así como lo está traduciendo MySQL, aunque en los manuales también estoy leyendo la palabra <strong>&#8220;COLACIÓN&#8221;</strong>.</p>
<p>Como <strong><em>codificación</em></strong>, yo siempre elegía el <strong><em>UTF-8</em></strong>, y ya está&#8230;, del cotejamiento no tenía NI IDEA. Entonces, buscando pude encontrar las <strong><em>diferencias que tenían los cotejamientos: utf8_unicode_ci y el utf8_general_ci</em></strong>,  ambos <span style="text-decoration: underline;">los más conocidos</span> de UTF8.</p>
<p><strong>Opinión: </strong>Desde mi punto vista el objetivo principal de los cotejamientos es el de proporcionar una codificación UTF-8, pero los objetivos que se puedan plantear, individualmente, cada cotejamiento son totalmente distintos, los cuales intentan tener en cuenta la precisión, la rapidez, la internacionalidad&#8230;</p>
<h3>Características utf8_unicode_ci</h3>
<ol>
<li>No soporta parcialmente el Algoritmo de  Colación Unicode</li>
<li>Aunque no soporte totalmente el Algoritmo de Colación Unicode, la característica más significativa es que <strong>soporta EXPANSIONES</strong>, esto es visible o palpable: <em>&#8220;cuando hacemos una comparación de caracteres, un carácter resulta igual a una combinación de caracteres, por ejemplo, </em><strong><em>&#8216;</em></strong><strong><em>ß&#8217; =&gt; &#8217;ss&#8217; </em></strong><em>&#8220;</em></li>
</ol>
<h3>Características utf8_general_ci</h3>
<ol>
<li>Es una <strong>colación heredada</strong>, la cual <strong>NO soporta EXPANSIONES</strong>.</li>
<li>Sólo puede hacer c<strong>omparaciones entre caracteres uno a uno</strong></li>
<li>Estas c<strong>omparaciones</strong> son muy <strong>rápidas</strong></li>
</ol>
<h3>UTF8_Unicode_ci VS UTF8_General_ci</h3>
<p>Los tiros van por el último punto del utf8_general_ci que he expuesto,<em><strong> La Rapidez</strong></em>. Pero nos tenemos que hacer la siguiente pregunta:</p>
<h4>¿Queremos RAPIDEZ o PRECISIÓN?</h4>
<p>Con estos dos tipos de colaciones no podemos tener ambas a la vez, por lo tanto, nos decantaremos por una sola. Dependiendo de cual nos decantemos elegiremos la colación:</p>
<ul>
<li><em><strong> Rapidez </strong>= utf8_general_ci</em></li>
<li><em><strong>Precisión </strong>= utf8_unicode_ci</em></li>
</ul>
<p>Especifiquemos el <strong>POR QUÉ</strong>:<br />
<strong>Utf8_unicode_ci</strong>, al soportar Expansiones, permite que un carácter (el <strong>&#8216;</strong><strong>ß&#8217; </strong> en Alemán, por ejemplo) se transforme en una combinación de caracteres (el <strong>&#8217;ss&#8217;</strong> del ejemplo anterior). Entonces esta colación tiene en cuenta esta posibilidad a la hora de hacer una comparación entre caracteres.<br />
En cambio, el <strong>utf8_general_ci</strong>, al no soportar EXPANSIONES la comparación de <strong>&#8216;</strong><strong>ß&#8217; es &#8217;s&#8217;</strong> porque solamente mira un carácter. Esto significa que <strong>estas comparaciones son más rápidas pero &#8216;ligeramente&#8217; menos correctas</strong>.</p>
<h4>Comparaciones correctas en ambas colaciones:</h4>
<pre><code>
Ä = A
Ö = O
Ü = U
</code></pre>
<h4>Comparaciones incorrectas para utf8_general_ci:</h4>
<pre><code>
ß = s
</code></pre>
<p><em>Si</em> en nuestra Página Web, aplicación,&#8230; <em>no tiene que haber problemas con caracteres &#8216;raros&#8217;</em>, <em>la elección es <strong>utf8_general_ci</strong>, es mucho <strong>más rápido</strong></em>. <em>De lo contrario</em> la colación debería ser <em><strong>utf8_unicode_ci</strong></em>.</p>
<p>Os pongo el link de donde he sacado la info: <a title="MySQL Reference diferencias colaciones" href="http://dev.mysql.com/doc/refman/5.0/es/charset-unicode-sets.html" target="_blank">MySQL5 Reference</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bibigeek.com/2009/10/05/mysql-la-codificacion-utf8-y-su-cotejamiento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Activar Motor InnoDB en MySQL</title>
		<link>http://www.bibigeek.com/2009/09/01/activar-motor-innodb-en-mysql/</link>
		<comments>http://www.bibigeek.com/2009/09/01/activar-motor-innodb-en-mysql/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 18:23:58 +0000</pubDate>
		<dc:creator>bibigeek</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Ubuntu Server]]></category>

		<guid isPermaLink="false">http://www.bibigeek.com/?p=661</guid>
		<description><![CDATA[Gracias a un comentario de arleyb, he comprobado puede darse el caso que en el fichero de configuración no tengáis activado el Motor de Almacenamiento InnoDB.
Yo lo he probado en dos servidores, uno gentoo y otro Ubuntu Server y he podido comparar los resultados (en el primero no funciona y en el segundo va de [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Gracias</strong> a un comentario de <strong>arleyb</strong>, he comprobado puede darse el caso que en el fichero de configuración no tengáis activado el Motor de <a title="Foreign Key con Mysql" href="http://www.bibigeek.com/2009/08/30/crear-foreign-key-con-mysql/" target="_self">Almacenamiento InnoDB</a>.<br />
Yo lo he <strong>probado</strong> en <strong>dos servidores</strong>, uno <strong><em>gentoo</em></strong> y otro <strong><em>Ubuntu Server</em></strong> y he podido comparar los resultados (en el primero no funciona y en el segundo va de perlas).</p>
<h3>Solución para activar InnoDB en MySQL</h3>
<p>La <em><strong>solución</strong></em> es tan simple como la de <em><strong>comentar una línea</strong></em> en el fichero de configuración del MySQL, la línea es esta: <span style="color: #ff0000;"><strong>&#8220;skip innodb&#8221;</strong></span>. Hay que <em>comentarla</em> con el carácter <em>almohadilla</em> <strong>&#8216;#&#8217;</strong>.<br />
Este <em>fichero de configuración</em> se llama <strong>my.cnf</strong> y lo podemos encontrar en el <strong>directorio /etc/mysql/my.cnf.</strong><br />
<strong>Importante</strong>, después de realizar la modificación <strong>REINICIAR el MySQL.</strong></p>
<p>Para aquellos que tengan un <strong>servidor compartido</strong>, supongo que os tendréis que poner en contacto con el <strong>servicio técnico</strong> para que se active esta opción. Por temas de rendimiento, a lo mejor lo tienen desactivado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bibigeek.com/2009/09/01/activar-motor-innodb-en-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPMyAdmin crear la Integridad Referencial (FK&#8217;s)</title>
		<link>http://www.bibigeek.com/2009/08/31/phpmyadmin-crear-integridad-referencial-foreign-key/</link>
		<comments>http://www.bibigeek.com/2009/08/31/phpmyadmin-crear-integridad-referencial-foreign-key/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 16:55:24 +0000</pubDate>
		<dc:creator>bibigeek</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHPMyAdmin]]></category>

		<guid isPermaLink="false">http://www.bibigeek.com/?p=556</guid>
		<description><![CDATA[Hola de nuevo,
Vuelvo con otro POST de MySQL, ya os dije en el anterior POST que había investigado mucho  &#8230; lo que me dejé en deciros es que me volví un poco loco y paranoico xD xD.
¿Cómo aplicar la Integridad Referencial con PHPMyAdmin? ¿Cómo crear las Foreign Key en PHPMyAdmin?
Estas dos preguntas podrían ser [...]]]></description>
			<content:encoded><![CDATA[<p>Hola de nuevo,<br />
Vuelvo con otro POST de MySQL, ya os dije en el <a href="http://www.bibigeek.com/2009/08/30/crear-foreign-key-con-mysql/">anterior POST</a> que había investigado mucho <img src='http://www.bibigeek.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> &#8230; lo que me dejé en deciros es que me volví un poco loco y paranoico xD xD.</p>
<h3>¿Cómo aplicar la Integridad Referencial con PHPMyAdmin? ¿Cómo crear las Foreign Key en PHPMyAdmin?</h3>
<p>Estas dos preguntas podrían ser la misma, ya que para <em><strong>aplicar la Integridad Referencial se necesitan las Foreign Key</strong></em>, pero seguro que habrá gente que no conocerá la palabra Foreign Key y sí Integridad Referencial o viceversa. Vamos a utilizar el mismo ejemplo del anterior POST: el coche &#8211; modelo &#8211; servicio técnico. Veamos de nuevo el <strong>diagrama</strong>:</p>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/modeloBDPostMySQL_modificada.jpg"><img class="aligncenter size-medium wp-image-604" title="Modelo BD Post MySQL y las FKs" src="http://www.bibigeek.com/wp-content/uploads/2009/08/modeloBDPostMySQL_modificada-220x300.jpg" alt="Modelo BD Post MySQL y las FKs" width="220" height="300" /></a></p>
<h3>Pasos a realizar para añadir la Integridad Referencial con PHPMyAdmin</h3>
<p><strong>1.</strong> <strong>Crear</strong> una <strong>Base de Datos</strong> (el nombre el que queráis).</p>
<p><strong>2.</strong> <strong>Crear todas las Tablas</strong>. Según el <em>Modelo Relacional</em> hay que crear <em>4 Tablas</em>, de las cuales hay una es la que contiene las relaciones entre la T_COCHE y T_SERVICIO. <strong>Al crear una Tabla</strong> hay que <strong>especificar</strong> que el <strong>Motor de almacenamiento sea el InnoDB</strong> y <strong>no</strong> el que viene por defecto, el <strong>MyISAM</strong>. Como en el modelo no he especificado los campos/entidades tendremos que mirar todo el manual, lo siento.</p>
<p style="padding-left: 30px;"><em><strong>- Creamos la Tabla T_COCHE:</strong></em></p>
<p><a class="lightbox" title="Tabla T_COCHE" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHE.jpg"><img class="size-medium wp-image-609 aligncenter" title="Tabla T_COCHE" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHE-300x119.jpg" alt="Tabla T_COCHE" width="300" height="119" /></a></p>
<p style="padding-left: 60px;">Contiene <em>tres campos</em>: <em><strong>MARCA</strong></em> la especificamos como la <em>Primary Key, <strong>NOMBRE</strong></em> y <strong><em>DESCRIPCION</em></strong>. Como podréis fijaros lo que SÍ es importante es que el <em>combo de longitud / Valores</em> tiene una cantidad u otra, eso va según lo que vayamos necesitando. Otra cosa a tener en cuenta es el <strong>COTEJAMIENTO</strong>, hemos puesto el <strong><em>utf8-general-ci</em></strong> (dedicaré un POST para explicar la <em>diferencia</em> entre el cotejamiento <em>utf8-unicode-ci </em>y el <em>utf8-general-ci</em>, lo estuve buscando y me gustó como <em>Tema para un POST</em>, así no se me olvidan los conocimientos). Veamos el resumen después de dar de alta la Tabla:</p>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHEOK.jpg"><img class="size-medium wp-image-611 aligncenter" title="Tabla T_COCHE" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHEOK-300x140.jpg" alt="Tabla T_COCHE" width="300" height="140" /></a></p>
<p style="padding-left: 60px;">Esta última imagen se muestra el <strong>resumen</strong>, tanto del<em> código SQL</em> como la especificación de las <em>entidades</em>, los botones pertinentes para hacer las <em>modificaciones</em>, <em>eliminar</em> la entidad&#8230; También nos especifica cual es la <em>Primary Key</em>.</p>
<p style="padding-left: 30px;"><em><strong>- Creamos la Tabla T_MODELO:</strong></em></p>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELO_PART1.jpg"><img class="aligncenter size-medium wp-image-619" title="Tabla T_MODELO parte 1" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELO_PART1-300x133.jpg" alt="Tabla T_MODELO parte 1" width="300" height="133" /></a><br />
<a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELO_PART2.jpg"><img class="aligncenter size-medium wp-image-620" title="Tabla T_MODELO PART2" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELO_PART2-300x278.jpg" alt="Tabla T_MODELO PART2" width="300" height="133" /></a></p>
<p style="padding-left: 60px;">Hay dos imágenes porque en una no me cabía el pantallazo <img src='http://www.bibigeek.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> . Aquí podéis fijaros que he creado un <em><strong>autonumérico</strong></em> (<em>IDMODELO</em>) que será la <em>Primary Key</em>. Le he especificado que <em>no</em> pueden ser <em>números negativos</em> (ocupa menos B) y como en el resto de campos, el cotejamiento es <em>utf8-general-ci</em>. Fijarse que nuevamente para la creación de la tabla especificamos que el <strong>Motor de Almacenamiento sea InndoDB</strong>. Igual que en la anterior Tabla, mostramos el resumen de su creación:</p>
<p><span id="more-556"></span><br />
<a class="lightbox" title="Tabla T_MODELO" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELOOK.jpg"><img class="size-medium wp-image-629 aligncenter" title="Tabla T_MODELO" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELOOK-300x142.jpg" alt="Tabla T_MODELO" width="300" height="142" /></a></p>
<p style="padding-left: 30px;"><em><strong>- Creamos la Tabla T_SERVICIOTECNICO:</strong></em></p>
<p style="padding-left: 60px;">Aunque el nombre no corresponda con el del diagrama especificado (T_SERVICIO), es lo mismo y no ha cambiado para nada su función u objetivo, sólo se ha cambiado porque quedaba mucho más claro que el nombre anterior.</p>
<p style="padding-left: 60px;">En esta tabla no hay mucho que explicar ya que es lo mismo que en las anteriores Tablas (después de esto ya vendrán las relaciones Foreign Key). Solamente pondré las imágenes para que quede totalmente claro cuales son los campos, los tipos, longitud/Valores, etc. Imágenes de su creación:</p>
<p><a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_SERVICIOTECNICO_PART1.jpg"><img class="size-medium wp-image-630 aligncenter" title="Tabla T_SERVICIOTECNICO Parte1" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_SERVICIOTECNICO_PART1-300x155.jpg" alt="Tabla T_SERVICIOTECNICO Parte1" width="300" height="155" /></a><br />
<a class="lightbox" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_SERVICIOTECNICO_PART2.jpg"><img class="aligncenter size-medium wp-image-631" title="Tabla T_SERVICIOTECNICO" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_SERVICIOTECNICO_PART2-270x300.jpg" alt="Tabla T_SERVICIOTECNICO" width="270" height="180" /></a></p>
<p style="padding-left: 60px; text-align: left;">Ahora vendrá la imagen del resumen de la creación de la Tabla:</p>
<p><a class="lightbox" title="Tabla T_SERVICIOTECNICO" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_SERVICIOTECNICOOK.jpg"><img class="aligncenter size-medium wp-image-632" title="Tabla T_SERVICIOTECNICO" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_SERVICIOTECNICOOK-300x139.jpg" alt="Tabla T_SERVICIOTECNICO" width="300" height="139" /></a></p>
<p style="padding-left: 30px;"><em><strong>- Creamos la Tabla T_COCHE_SERVTEC:</strong></em></p>
<p style="padding-left: 60px;">Sólo voy a añadir una imagen, ya que estos dos campos tienen que tener la MISMA especificación que los ID&#8217;s que tienen las tablas: <em>T_COCHE</em> y <em>T_SERVICIOTECNICO</em>.</p>
<p style="padding-left: 60px;"><strong><em>¿Por qué la misma especificación? </em></strong>Porqué esta tabla va a ser la que contenga la <strong><em>relación N &#8211; N</em></strong> del <strong>Modelo Entidad Relación (MER)</strong> que hemos explicado en el diagrama y van a ser los mismos valores. Si no lo ponemos idénticamente, a la hora de hacer la relación, el MySQL nos lanzará una excepción de Error. Veamos la imagen con la especificación:</p>
<p><a class="lightbox" title="Tabla T_COCHE_SERVTEC" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHE_SERVTECOK.jpg"><img class="aligncenter size-medium wp-image-635" title="Tabla T_COCHE_SERVTEC" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHE_SERVTECOK-300x135.jpg" alt="Tabla T_COCHE_SERVTEC" width="300" height="135" /></a><br />
<strong>3.</strong> <strong>Crear los INDEX</strong>.</p>
<p style="padding-left: 30px;">Hay que <strong>crear obligatoriamente los INDEX</strong> para establecer las Foreign Keys, <em>¿pero a qué campo hay que aseginarle la propiedad <strong>Index</strong>?</em> Pues le asignaremos la propiedad INDEX a los campos que serán las FOREIGN KEY de la Tabla.</p>
<p style="padding-left: 30px;"><strong>- Creamos el Index de la Tabla T_MODELO:</strong></p>
<p style="padding-left: 60px;">Cuando he creado la Tabla <strong>T_MODELO</strong> he dejado un campo sin CREAR (aposta), que es la <em>FOREIGN KEY</em> de la <em>Tabla T_COCHE</em> (esto responde a la relacion<em> 1-N</em> entre <em>T_COCHE &#8211; T_MODELO</em>). Por lo tanto, ahora voy a poner dos imágenes de cómo creo el nuevo Campo. Va a tener la misma especificación que la Primary Key de la Tabla T_COCHE (MARCA) y le añadiré la propiedad de INDEX:</p>
<p><a class="lightbox" title="Tabla T_MODELO Crear INDEX" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODEL_CREAR_INDICE.jpg"><img class="aligncenter size-medium wp-image-638" title="Tabla T_MODELO Crear INDEX" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODEL_CREAR_INDICE-300x139.jpg" alt="Tabla T_MODELO Crear INDEX" width="300" height="139" /></a></p>
<p style="padding-left: 60px;">Veamos ahora la imagen que muestra el resumen de la creación del nuevo Campo. <strong>He resaltado dos cosillas</strong>: una <em><strong>nueva función</strong></em> que podemos realizar con la <em><strong>Tabla &#8220;Vista de relaciones&#8221;</strong></em>, y segundo, emmarco el <strong>INDEX </strong>que le he llamado igual que la Primary Key, <strong>MARCA</strong>.</p>
<p><a class="lightbox" title="Tabla T_MODELO creado INDEX" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELO_INDICEOK.jpg"><img class="aligncenter size-medium wp-image-641" title="Tabla T_MODELO creado INDEX" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_MODELO_INDICEOK-300x139.jpg" alt="Tabla T_MODELO creado INDEX" width="300" height="139" /></a></p>
<p style="padding-left: 30px;"><strong>- Creamos los INDEX de la Tabla T_COCHE_SERVTEC:</strong></p>
<p style="padding-left: 60px;">En esta tabla <strong>las Primary Keys</strong>, que son <em>IDMODELO </em>e <em>IDSERVICIO</em>, <strong>también van a ser los INDEX</strong> , ya que son las Foreign Keys de sus respectivas Tablas. <strong>NO importa </strong>hacer una <strong>MODIFICACIÓN </strong>de los campos creados, sólo tendremos que pulsar el botón de INDEX de la Sección <em>&#8220;ACCIÓN</em>&#8221; de PHPMyAdmin, automáticamente ya hace el ALTER TABLE. Mirad la siguiente imagen, lo describe mucho mejor:</p>
<p><a class="lightbox" title="Tabla T_COCHE_SERVTEC crear INDEXs" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHE_SERVTEC_INDICE.jpg"><img class="aligncenter size-medium wp-image-644" title="Tabla T_COCHE_SERVTEC crear INDEXs" src="http://www.bibigeek.com/wp-content/uploads/2009/08/T_COCHE_SERVTEC_INDICE-300x130.jpg" alt="Tabla T_COCHE_SERVTEC crear INDEXs" width="300" height="130" /></a></p>
<p><strong>4.</strong> Creamos las <strong>Relaciones (Foreign Keys, FKs) con PHPMyAdmin</strong>.</p>
<p style="padding-left: 30px;">Cuando creamos un Tabla con el Motor INNODB y los INDEX correspondientes, si seleccionamos para ver la estructura de la Tabla, automáticamente se añade una nueva función en la Tabla: <strong>&#8220;Vista de Relaciones&#8221;</strong> (lo hemos visto hace dos imágenes). Por lo tanto, ahora veremos en las siguientes imágenes como crear las Foreign Key de forma gráfica con el PHPMyAdmin.</p>
<p style="padding-left: 30px;"><strong>- Creamos la Foreign Key de la Tabla T_MODELO:</strong></p>
<p style="padding-left: 60px;">Primero entramos en la estructura de la Tabla.<br />
Después pulsamos el botón de la función: <strong>&#8220;Vista de relaciones&#8221;</strong>. Ver imagen:<br />
<a class="lightbox" title="VISTA_RELACIONES_PHPMYADMIN_T_MODELO" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/VISTA_RELACIONES_PHPMYADMIN_T_MODELO.jpg"><img class="aligncenter size-medium wp-image-645" title="VISTA_RELACIONES_PHPMYADMIN_T_MODELO" src="http://www.bibigeek.com/wp-content/uploads/2009/08/VISTA_RELACIONES_PHPMYADMIN_T_MODELO-300x141.jpg" alt="VISTA_RELACIONES_PHPMYADMIN_T_MODELO" width="300" height="141" /></a></p>
<p style="padding-left: 60px;">Una Vez pulsado el botón accederemos una nueva página de PHPMyAdmin la cual nos indica cuales de los campos pueden ser Foreign Key. En este caso, el campo MARCA es nuestra Foreign Key, y la tenemos que relacionar con la Tabla T_COCHE. Veamos la imagen de como lo está mostrando el PHPMyAdmin:</p>
<p><a class="lightbox" title="FKS DISPONIBLES de la Tabla T_MODELO" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/FKS_DISPONIBLES_T_MODELO.jpg"><img class="aligncenter size-medium wp-image-648" title="FKS DISPONIBLES de la Tabla T_MODELO" src="http://www.bibigeek.com/wp-content/uploads/2009/08/FKS_DISPONIBLES_T_MODELO-300x100.jpg" alt="FKS DISPONIBLES de la Tabla T_MODELO" width="300" height="100" /></a></p>
<p style="padding-left: 60px;">Para <strong>relacionar la Tabla T_COCHE</strong> deberemos <strong>seleccionar</strong> la opcion <strong>T_COCHE -&gt; MARCA</strong>. Veamos la imagen del Resumen:</p>
<p><a class="lightbox" title="FK T_MODELO anyadido" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/FK_T_MODELO_OK.jpg"><img class="aligncenter size-medium wp-image-649" title="FK T_MODELO anyadido" src="http://www.bibigeek.com/wp-content/uploads/2009/08/FK_T_MODELO_OK-300x88.jpg" alt="FK T_MODELO anyadido" width="300" height="88" /></a></p>
<p style="padding-left: 60px;">Cómo podéis daros cuenta no es un procedimiento trivial, lleva su trabajillo y sus cosas, que si especificar el INNODB, crear los INDEX, ahora ya se pueden hacer las relaciones&#8230; no es fácil, pero cuando se hacen dos o tres la mecánica ya se lleva dentro.</p>
<p style="padding-left: 30px;"><strong>- Creamos las Relaciones de T_COCHE_SERVTEC:</strong></p>
<p style="padding-left: 60px;">Al ser el mismo procedimieto que el anterior, directamente os muestro el RESUMEN de como tendría que quedar la Tabla, veamos:</p>
<p><a class="lightbox" title="FK_T_COCHE_SERVTEC RESUMEN" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/FK_T_COCHE_SERVTEC_OK.jpg"><img class="aligncenter size-medium wp-image-650" title="FK_T_COCHE_SERVTEC RESUMEN" src="http://www.bibigeek.com/wp-content/uploads/2009/08/FK_T_COCHE_SERVTEC_OK-300x73.jpg" alt="FK_T_COCHE_SERVTEC RESUMEN" width="300" height="73" /></a></p>
<p>Hasta aquí el segundo POST, que algunos ya me escribieron comentarios en que lo esperaban.<br />
Daros las gracias a tod@s por vuestras ayuda, si hay algo que esté mal o que creáis que está mal expresado o que no se entiende, por favor, no dudéis en contactar conmigo y lo cambiamos.<br />
Muchas gracias a todos!!!! bibigeek!!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bibigeek.com/2009/08/31/phpmyadmin-crear-integridad-referencial-foreign-key/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Crear Foreign Key (Integridad Referencial) con MySQL</title>
		<link>http://www.bibigeek.com/2009/08/30/crear-foreign-key-con-mysql/</link>
		<comments>http://www.bibigeek.com/2009/08/30/crear-foreign-key-con-mysql/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 09:09:11 +0000</pubDate>
		<dc:creator>bibigeek</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.bibigeek.com/?p=553</guid>
		<description><![CDATA[Hace unos días que estoy bastante liado buscando información sobre MySQL, claves foráneas (o en inglés, foreign Key) y la Inegridad Referencial&#8230;
No es que sea un experto con el MySQL pero intentaré explicar todo lo que he aprendido:
Definición de Integridad Referencial
Podemos entender como Integridad Refencial a la propiedad, aplicada en las Bases de Datos, que [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días que estoy bastante liado buscando información sobre MySQL, claves foráneas (o en inglés, foreign Key) y la Inegridad Referencial&#8230;<br />
No es que sea un experto con el MySQL pero intentaré explicar todo lo que he aprendido:</p>
<h3>Definición de Integridad Referencial</h3>
<p>Podemos entender como Integridad Refencial a la propiedad, aplicada en las Bases de Datos, que nos garantiza que una Entidad (fila o registro) se relaciona con otra entidad que EXISTE en la Base de Datos. Nos aseguramos en todo momento que la información no esté repetida innecesariamente, que exita tal información, relaciones mal hechas&#8230;</p>
<h3>Definición de Claves Foráneas &#8211; Foreign Key</h3>
<p>Una clave foránea, o foreign key, no es más que un campo (Entidad) de un tabla que hace referencia al identificador de otra Tabla.</p>
<h3>MySQL &#8211; Integridad Referencial y las Foreign Key</h3>
<p>En las primeras versiones de MySQL (hasta aproximadamente la versión 3.23) la <strong><em>Integridad Referencial</em></strong> <strong>no estaba disponible</strong>, y a la hora de crear la Base de Datos, esta Integridad debía ser controlada por parte de la aplicación.</p>
<p>A la hora de crear una Base de Datos, el motor por defecto de MySQL es el MyISAM pero a partir de la versión 3.23 (según la <a title="Wikipedia InnoDB" href="http://es.wikipedia.org/wiki/InnoDB" target="_blank">Wikipedia</a> en la versión 4 de MySQL) se incorpora el <strong>motor InnoDB</strong>, que nos permitirá tener Bases de Datos con Integridad Referencial.</p>
<p>Tengo que decir que no sé muy bien como interpreta el motor MyISAM la sintaxis de Foreign Key (<a title="Foreign Keys Documento MySQL" href="http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html" target="_blank">por lo que he podido entender</a>&#8230; lo interpreta como si fueran CREATE TABLE), pero si puedo asegurar, es que la Integridad Referencial no se aplica nativamente para este motor.</p>
<h3>¿Qué es el Motor MyISAM?</h3>
<p>Es el <a title="Wikipedia MyISAM" href="http://es.wikipedia.org/wiki/MyISAM" target="_blank">motor de almacenamiento por defecto del MySQL</a>. Como propiedades relevantes tenemos que destacar su gran rapidez con las consultas, &#8220;ya que no tiene que hacer comprobaciones de Integridad Referencial&#8221;. Está realmente <strong>optimizado</strong> para aplicaciones, sistemas, programas&#8230; en las que <strong>no hay un número elevado de inserciones</strong>.</p>
<h3>¿Qué es el Motor InnoDB?</h3>
<p><span id="more-553"></span><br />
El innoDB es una tecnología de almacenamiento de datos, se caracteriza por soportar <strong>transacciones de tipo <a title="wikipedia ACID" href="http://es.wikipedia.org/wiki/ACID" target="_blank">ACID</a></strong> e <strong>incluir la Integridad Referencial</strong>. Sé que me repito mucho, pero la llegada de este motor de almacenamiento en MySQL, nos permite definir <strong>Claves Foráneas (Foreign Key)</strong>, y gracias a ello, <em>definir reglas o restricciones que nos aseguren la <strong>Integridad Referencial</strong></em> de los registros de la Tabla/Base de Datos.</p>
<h3>¿Cómo especificamos el tipo de motor a utilizar en MySQL?</h3>
<p>A la hora de crear una tabla hay que indicarle la opción <strong>ENGINE</strong>. Con esta opción le indicaremos el motor que tiene esta tabla en concreto: MyISAM, InnoDB, BDB, &#8230; veamos un ejemplo sencillo:</p>
<pre><code><strong>CREATE TABLE</strong> `PRUEBA` (
     ID int(10) unsigned NOT NULL auto_increment COMMENT 'IDENTIFICADOR TABLA',
     NAME varchar(40) NOT NULL COMMENT 'NOMBRE PELICULA',
     DESCRIPTION varchar(255) default NULL COMMENT 'DESCRIPCION PELICULA',
     CREATIONDATE timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT 'FECHA DADA DE ALTA LA PELICULA',
     PRIMARY KEY  (ID),
) <strong>ENGINE=MYISAM</strong> DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
</code></pre>
<h3>InnoDB vs MyISAM</h3>
<p>Antes de llegar a la especificación de cómo crear la Integridad Referencial por código SQL, voy a enumerar primero las diferencias que podemos encontrar en los tipos de motor de almacenamiento InnoDB y MyISAM. ¿Por qué? Porque según la función e implicación que tenga que tener nuestra Base de Datos nos podemos decantar por uno o por otro motor.</p>
<h4>InnoDB:</h4>
<ul>
<li><strong>Permite el uso de Transacciones:</strong> no es más que todo un <strong><em>conjunto de órdenes</em></strong> que se ejecutan <em><strong>como</strong></em> si fueran una <em><strong>unidad de trabajo</strong></em>, dicho de otro modo, que este bloque de órdenes (transacciones) <em><strong>no finalizan en un estado intermedio</strong></em>. Si alguna orden se ha ejecutado y  no finaliza la ejecución de todo el bloque de órdenes correctamente, el SGBD (Sitema Gestor de Base de Datos) se encargará (como de un rollback se tratase&#8230;) de dejar la Base de Datos en el estado inicial.</li>
<li><strong>Las Transacciones son de Tipo ACID:</strong> acrónimo de <strong>A</strong>tomicity, <strong>C</strong>onsistency, <strong>I</strong>solation and <strong>D</strong>urability (o dicho en español: Atomicidad, Consistencia, Aislamiento y Durabilidad).</li>
<li>Si nuestra Aplicación utiliza mucho el <strong>uso de Inserts y Updates</strong> notaremos una <strong>gran mejoría</strong> respecto al motor MyISAM.</li>
<li><strong>La caché de las lecturas y escrituras de los registros</strong> se realiza mediante una combinación entre Cachés de registro y de índice. Con lo consecuente, InnoDB no envia los cambios de la tabla al Sistema Operativo (S.O., opción más lenta&#8230;) para que los escriba, por lo tanto, es mucho más rápido que MyISAM <em>en según que escenarios</em>.</li>
<li><strong>ACTUALIZACIÓN</strong> <em>gracias a <a title="Blog de Ikhuerta" href="http://blog.ikhuerta.com" target="_blank">ikhuerta</a></em>. <strong>Bloqueo a nivel de registro</strong>, es decir, por <strong>cada petición (Selects, Inserts, updates&#8230;)</strong> que se haga a la tabla <strong>se bloquea a nivel de REGISTRO</strong>, en cambio MyISAM bloquea toda la tabla entera hasta finalizar su ejecución, pudiendo así crear una cola de peticiones. Del otro modo, al bloquear solamente el registro necesario, el resto de registros quedan libres para su utilización.</li>
</ul>
<h4>MyISAM:</h4>
<ul>
<li><strong>Mayor velocidad</strong> en general a la hora de <strong>recuperar datos</strong>.</li>
<li>Es <strong>recomendable</strong> para aquellas <strong>B</strong>ase de <strong>D</strong>atos<strong> donde predominan los Selects</strong> y no los Inserts o Updates.</li>
<li>Con la <strong>ausencia de Automacidad</strong> (no hay comprobaciones de integridad referencial, no hay bloqueos de tablas,&#8230;) obtenemos nuevamente una <strong><em>mayor velocidad</em></strong>.</li>
<li>Cuenta con una <strong>algoritmo de Compresión de Datos</strong> muy eficiente, de modo que el espacio en disco, Ram o caché, es realmente inferior al del motor InnoDB. Aunque he leído que el motor <em><strong>InnoDB ha mejorado este aspecto</strong></em> y ya está <strong><em>en práctica en el MySQL 5</em></strong>, reduciendo así un 20% del espacio.</li>
<li><strong>No soporta Transacciones</strong>, <em>¿ventaja o desventaja?</em> Según lo que pone la wiki puede llegar a ser una ventaja, por el simple echo que los accesos a disco que tiene el motor InnoDB es de almenos una por cada transacción. Esto supone una limitación de transacciones para los discos duros, de aproximadamente unas 200 por segundo.</li>
</ul>
<p>Hasta aquí creo que ya es suficiente de teoría, es una buena recopilación de información, ahora pasemos a lo importante:<strong> &#8220;LOS EJEMLOS&#8221;.</strong></p>
<h3>Código SQL, para montar la Integridad Referencial</h3>
<p>Veamos un ejemplo del <strong>Esquema en MER</strong>(<em>Modelo Entidad Relación</em>) <strong>y MR</strong> (<em>Modelo Relacional,</em> después de normalizar el MER), adjunto imagen:</p>
<p style="text-align: center;"><a class="lightbox" title="Modelo BD Post MySQL y las FKs" rel="lightbox[roadtrip]" href="http://www.bibigeek.com/wp-content/uploads/2009/08/modeloBDPostMySQL_modificada.jpg"><img class="aligncenter size-medium wp-image-604" title="Modelo BD Post MySQL y las FKs" src="http://www.bibigeek.com/wp-content/uploads/2009/08/modeloBDPostMySQL_modificada-220x300.jpg" alt="Modelo BD Post MySQL y las FKs" width="220" height="300" /></a></p>
<p>Ahora veamos el <strong>código SQL</strong> para ver como se crearía esta Base de Datos y todas sus relaciones:</p>
<pre><code>
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

<strong>--
-- Base de datos: `testpostFKs`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `T_COCHE`
--</strong>

<strong>CREATE</strong> <strong>TABLE IF NOT EXISTS</strong> `T_COCHE` (
     `MARCA` varchar(20) NOT NULL,
     `ORIGEN` varchar(25) NOT NULL,
     `FECHAINICIO` datetime NOT NULL,
     <em><strong>PRIMARY KEY</strong></em>  (`MARCA`)
) <strong>ENGINE=InnoDB</strong> DEFAULT CHARSET=utf8;

<strong>--
-- Volcar la base de datos para la tabla `T_COCHE`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `T_COCHE_SERVTEC`
--</strong>

<strong>CREATE TABLE IF NOT EXISTS</strong> `T_COCHE_SERVTEC` (
     `IDMODELO` int(10) unsigned NOT NULL,
     `IDSERVICIO` int(10) unsigned NOT NULL,
     <em><strong>PRIMARY KEY</strong></em>  (`IDMODELO`,`IDSERVICIO`),
     <em><strong>KEY</strong></em> `IDMODELO` (`IDMODELO`),
     <em><strong>KEY</strong></em> `IDSERVICIO` (`IDSERVICIO`)
) <strong>ENGINE=InnoDB</strong> DEFAULT CHARSET=utf8;

<strong>--
-- Volcar la base de datos para la tabla `T_COCHE_SERVTEC`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `T_MODELO`
--</strong>

<strong>CREATE TABLE IF NOT EXISTS</strong> `T_MODELO` (
     `IDMODELO` int(10) unsigned NOT NULL auto_increment,
     `NAME` varchar(25) NOT NULL,
     `DESCRIPTION` varchar(255) default NULL,
     `FECHAEXPEDICION` datetime default NULL,
     `DISENYADOR` varchar(25) NOT NULL,
     `MARCA` varchar(20) NOT NULL,
     <em><strong>PRIMARY KEY</strong></em>  (`IDMODELO`),
     <strong><em>KEY</em></strong> `MARCA` (`MARCA`)
) <strong>ENGINE=InnoDB</strong> DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

<strong>--
-- Volcar la base de datos para la tabla `T_MODELO`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `T_SERVICIOTECNICO`
--</strong>

<strong>CREATE TABLE IF NOT EXISTS</strong> `T_SERVICIOTECNICO` (
     `IDSERVICIO` int(10) unsigned NOT NULL auto_increment,
     `NOMBRE` varchar(40) NOT NULL,
     `PAIS` varchar(25) NOT NULL,
     `PROVINCIA` varchar(25) NOT NULL,
     `LOCALIDAD` varchar(25) NOT NULL,
     `DIRECCION` varchar(255) NOT NULL,
     `TELEFONO` int(10) unsigned default NULL,
     `FAX` int(10) unsigned default NULL,
     <em><strong>PRIMARY KEY</strong></em>  (`IDSERVICIO`)
) <strong>ENGINE=InnoDB</strong> DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

<strong>--
-- Volcar la base de datos para la tabla `T_SERVICIOTECNICO`
--

--
-- Filtros para las tablas descargadas (dump)
--

--
-- Filtros para la tabla `T_COCHE_SERVTEC`
--</strong>
<strong>ALTER TABLE</strong> `T_COCHE_SERVTEC`
<strong>ADD CONSTRAINT</strong> `T_COCHE_SERVTEC_ibfk_2` FOREIGN KEY (`IDSERVICIO`) REFERENCES `T_SERVICIOTECNICO` (`IDSERVICIO`) ON DELETE CASCADE ON UPDATE CASCADE,
<strong>ADD CONSTRAINT</strong> `T_COCHE_SERVTEC_ibfk_1` FOREIGN KEY (`IDMODELO`) REFERENCES `T_MODELO` (`IDMODELO`) ON DELETE CASCADE ON UPDATE CASCADE;

<strong>--
-- Filtros para la tabla `T_MODELO`
--</strong>
<strong>ALTER TABLE</strong> `T_MODELO`
<strong>ADD CONSTRAINT</strong> `T_MODELO_ibfk_1` FOREIGN KEY (`MARCA`) REFERENCES `T_COCHE` (`MARCA`) ON DELETE CASCADE ON UPDATE CASCADE;
</code></pre>
<p><strong>Puntos a tener en CUENTA</strong>:</p>
<ul>
<li>El motor de almacenamiento es INNODB (<em><strong>Engine=INNODB</strong></em>)</li>
<li>El campo o entidad que representa la <strong>Foreign Key</strong>, para indicarle realmente que es una Foreign Key, primero hay que especificarle que es un <strong>INDEX</strong>, lo hacemos así: <strong>KEY `IDSERVICIO` (`IDSERVICIO`)</strong></li>
<li>Hay que <strong>indicarle</strong> a la <strong>Foreign Key la función a ejecutar</strong> por parte de la Base de Datos <strong>cuando</strong> <strong>se elimine una Clave Primaria (PK)</strong>, por ejemplo, si eliminamos una tupla de T_COCHE ¿cómo tiene que proceder la base de datos con las otras tablas que estén referenciadas? Para eso sirve el: <strong>ON DELETE CASCADE ON UPDATE CASCADE</strong></li>
</ul>
<p>Hasta aquí este post, el siguiente será: <strong>Montar la Integridad Referencial con PHPMyAdmin.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bibigeek.com/2009/08/30/crear-foreign-key-con-mysql/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
