El error 1025 (errno: 150)
28 01 2010Aunque 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_nameFROM information_schema.KEY_COLUMN_USAGE keWHERE ke.referenced_table_name IS NOT NULLORDER 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.
Comentarios : Leave a Comment »
Etiquetas: clave ajena, comando, error, mysql
Categorías : General
Set Default no funciona en Mysql
27 01 2010Al 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.
Comentarios : Leave a Comment »
Etiquetas: carencias, clave ajena, mysql
Categorías : General
Crear índices sin utilizar todo el campo
18 12 2009Resulta 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));
Comentarios : Leave a Comment »
Categorías : General
Mayúsculas y minúsculas en Mysql
18 12 2009Por 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');
Comentarios : Leave a Comment »
Categorías : General
Fechas y MySql
16 12 2009Cosas ú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.
Comentarios : Leave a Comment »
Categorías : General
Comando Limit
15 12 2009El comando LIMIT permite acotar el numero de registros devuelto. Tiene dos posibilidades:
- LIMIT numero
Devuelve los primeros numero registros
SELECT * FROM emple LIMIT 10
devuelve los 10 primeros registros (normalmente habría que ordenarlos según algún criterio
- LIMIT inicial, numero
A partir del registro inicial (recordar que se empieza en cero) muestra los número registros siguientes
SELECT * FROM emple ORDER BY apellidos,nombre LIMIT 10,10
Muestra, a partir del registro 11 los diez siguientes.
Se suele utilizar en las páginas web para mostrar distintas páginas de resultados:
LIMIT 0,10, después un LIMIT 10,10, después un LIMIT 20,10, etc.
Comentarios : 1 Comment »
Etiquetas: comando, mysql
Categorías : General
Precedencia de Operadores lógicos en mysql
15 12 2009Si ponemos en un where varias condiciones separadas por AND y OR sin paréntesis, primero se realiza el AND y luego el OR, p. e.:
Where edad>=18 and edad<=65 or nombre='Ana'
Obtenemos los que están en edad de trabajar o su nombre es Ana. Si queremos los que No están en edad de trabajar y se llaman Ana, No sería:
where nombre='Ana' and edad<18 or edad>65
Con eso obtenemos todos los que tengan más de 65 años. Lo correcto sería:
where nombre='Ana' and (edad<18 or edad>65)
Conclusión: Si tenemos dudas, se usan paréntesis.
Comentarios : Leave a Comment »
Categorías : General
Comando básico de conexión a mysql
14 12 2009El comando para conectarnos es
mysql -h localhost -u usuario -p
donde localhost es la dirección del ordenador al que nos vamos a conectar y usuario es el nombre del usuario que utilizaremos.
Al ponerle la opción -p, nos pedirá la contraseña. Si queremos incluirla en la línea de comando, usaremos
mysql -h localhost -u usuario -pcontraseña
Todo junto, ya que si lo separamos con un espacio pensará que contraseña es el nombre de la base de datos a la que nos queremos conectar.
Comentarios : Leave a Comment »
Etiquetas: básico, mysql
Categorías : General