Encuesta rápida

30 11 2010




Funciones interesantes de TIMESTAMP

2 02 2010

Una función interesante del tipo de datos timestamp es la de utilizar la funcion CURRENT_TIMESTAMP() en los valores por defecto y/o en las actualizaciones. Vamos a ver un ejemplo:

Leer el resto de esta entrada »





El error 1025 (errno: 150)

28 01 2010

Aunque está suficientemente explicado en la ayuda de MySql, lo pongo aquí porque el mensaje de error es bastante críptico e induce a error. Al intentar hacer algo como

alter table nombre_tabla drop primary key;

Obtenemos el siguiente error:

Error on rename of '.\ejercicio_9\#sql-b8_c' to '.\ejercicio_9\nombre_tabla' (errno: 150)   ErrorNr. 1025

Pues bien, aunque no lo parezca este error nos indica que la tabla nombre_tabla está siendo referenciada por otra tabla. En otras palabras, hemos establecido un clave ajena sobre esa tabla. No tiene que ver ni con permisos, ni con bloqueos ni con cosas así.

Para solucionarlo, debemos primero eliminar esas claves ajenas definidas. Una forma de verlas es con la sentencia sql

SELECT ke.referenced_table_name parent, ke.table_name child, ke.constraint_name
FROM information_schema.KEY_COLUMN_USAGE ke
WHERE ke.referenced_table_name IS NOT NULL
ORDER BY ke.referenced_table_name;

(Tomado de los comentarios de la ayuda de MySql).

Así salen todas, para sacar las que nos causan problemas, añadir al where

and ke.referenced_table_name='nombre_tabla'

En las child, hacemos un

alter table nombre_tabla_child drop foreign key constraint_name;

Y ya podemos trabajar sin el error.





Set Default no funciona en Mysql

27 01 2010

Al utilizar tablas InnoDb (para exigir integridad referencial), los SGBD suelen ofrecer cuatro (o cinco) comportamientos ante el borrado/actualización de los registros referenciados:

  • CASCADE / en cascada.- Borrando o actualizando el registro referenciado (en la tabla padre), se borra/actualiza el registro en la tabla hija. Access avisa de que se van a borrar datos. Mysql no.
  • NO ACTION /sin acción .- No deja borrar/actualizar si existen registros en la tabla hija que hagan referencia al registro a borrar (en Mysql es equivalente a RESTRICT)
  • SET NULL/ poner a nulo.- Pone a null el registro que hace referencia
  • SET DEFAULT/poner al valor por defecto.- Pone al valor por defecto el registro que hace referencia

Pues bien, MySQL no permite la última opción, el SET DEFAULT.

Cuesta encontrar un ejemplo claro en el que sea útil esta opción pero podría ser algo como una tabla de coches con un campo conductor (clave ajena de la tabla conductor), con default ‘Libre’ y con null indicando lo que debe (que no se conoce o no es aplicable ningún valor).

Al borrar un conductor, se sabe que está libre y se debería poner a DEFAULT.

Este ejemplo no es correcto, ya que obliga a añadir un conductor fantasma, el Libre. Una solución más correcta sería añadir un booleano que indique si está libre o no el coche.

A ver si se me ocurre algún ejemplo.

Claro, en internet se dan ejemplos para ver cómo funciona pero estoy interesado en un ejemplo “real” en el que sea útil.





Crear índices sin utilizar todo el campo

18 12 2009

Resulta interesante que se pueden crear índices sobre campos de texto sin utilizar todo el campo. Por ejemplo, si apellidos tiene tamaño 150, no es probable que las variaciones afecten a los 150 caracteres. En ese caso (Por motivos de velocidad y de uso de memoria) sería aconsejable utilizar un índice sobre, por ejemplo los ~30 primeros caracteres (incluiría la mayoría de las variaciones del primer apellido y las primeras variaciones del segundo.

CREATE INDEX IX_APELLIDOS ON Personas(apellidos(30));





Mayúsculas y minúsculas en Mysql

18 12 2009

Por defecto, al definir un campo como texto (con VARCHAR o CHAR), mySql no distinguirá entre mayúsculas y minúsculas. Si se quiere distinguir en un campo, se definirá como Binary. ¿Y si después queremos buscar sin distinguir mayúsculas y minúsculas en ese campo?. Una solución: Si queremos buscar la cadena ‘Perico’ sin distinguir en el campo nombre definido como binary, podemos usar:

select *
from persona
where UPPER(nombre)=UPPER('Perico');




Fechas y MySql

16 12 2009

Cosas útiles sobre las fechas:

Lo primero, dos funciones importantes: NOW() y CURRENT-DATE()

ej:

select now();

devuelve la fecha y la hora actuales. Devuelve las dos. Su tipo de dato asociado es DATETIME

Como la salida puede no gustarnos (es España usamos dia/mes/año), lo normal es utilizar la función DATE_FORMAT(), por ejemplo:

select DATE_FORMAT(NOW(),’%d de %M de %Y’);

nos devolverá la fecha mejor formateada.