MySql insertar calendario agregando un año a una determinada fecha

Resulta que para un sistema que estamos desarrollando en la oficina, tengo una tabla con un Calendario  en el cual marco todos los dias inhabiles, esto lo uso para calcular los vencimientos de fechas de tramites, basado en el calculo de dias habiles, pero como estamos iniciando ejercicio, necesitaba insertar en la tabla cada dia del año 2013, pero recuperando los dias marcados como inhabiles (que no son los mismos, pero para pruebas esta bien ), asi que la sentencia que use fue esta:

insert into Calendario (select 0,DATE_ADD(fecha, interval 1 year),habil  from Calendario )

En resumen, insertar en la tabla Calendario, 0 (es el identificador autoincremental), tomar la fecha del registro actual y  agregarle un año, es decir por ejemplo 2012-01-01 pasaria a ser 2013-01-01, y se toma como base el calendario de 2012 existente en la tabla Calendario.

Bueno, lo tendre aqui en mi blog como futura referencia.

sum does not exist (Bug fantasma)

Hay veces que escribimos consultas en mysql, donde usamos la funcion sum, pero nos manda el error:

sum does not exist

esto es porque dejamos un espacio entre sum y el parentesis, ejemplo:

select sum (monto)

el problema es el espacio, quitandolo ya no marcara error.

quedando asi:  select sum(campo)

Este es un bug que de pronto no se entiende, pero solo es eso, el espacio….

ERROR 1 (HY000) at line 4: Can’t create/write to file

Este error de mysql en linux, se da cuando envias el resultado de una consulta a un archivo, por ejemplo:

mysql> SELECT * FROM clientes
-> INTO OUTFILE '/home/usuario/clientes.csv'
-> FIELDS TERMINATED BY ','
-> OPTIONALLY ENCLOSED BY '\"'
-> LINES TERMINATED BY '\n';

Segun lo que me paso a mi, el usuario mysql esta intentando crear el archivo /home/usuario/clientes.csv, sin embargo este user mysql no tiene permisos en esa carpeta,  y ese es el problema, si pruebas con :

 

mysql> SELECT * FROM clientes
-> INTO OUTFILE '/var/lib/mysql/clientes.csv'
-> FIELDS TERMINATED BY ','
-> OPTIONALLY ENCLOSED BY '\"'
-> LINES TERMINATED BY '\n';

no te dara ningun error,y te creara el archivo, ese directorio es donde estan los catalogos o bases de datos de mysql,  por ello es que tiene permisos, lo mejor es no meterse mucho en ese directorio, en vez de ello podriamos crear alguna carpeta temporal y dejar como dueño a mysql, con sus respectivos permisos, y enviar ahi lo que deseemos.

Espero les sea util.

 

 

Obtener lista de foreign keys de una base de datos

En ocasiones es necesario revisar  que no tengamos fk repetidos en una bd, o bien por simple curiosidad,  obtener la lista de fks para revisarlos.

En la bd information_schema tenemos esta info, y buscando en internet, encontre esta entrada;

http://www.binarytides.com/blog/list-foreign-keys-in-mysql/

de la cual tome el ejemplo, yo solo le agregue algunas columnas para que quede asi:

select table_schema as BD, table_name as tabla,constraint_name,
concat(table_name, ‘.’, column_name) as ‘foreign key’,'<—->’, concat(referenced_table_name, ‘.’, referenced_column_name) as ‘Referencia a:’
from
information_schema.key_column_usage
where
constraint_schema=»nombredetubd» and
referenced_table_name is not null
order by constraint_name ; — o por constraint_name podria ser util.

Como eliminar una clave foranea en MySql

Al intentar eliminar una FK en mysql, te tira un error semejante a:

ERROR 1025 (HY000): Error on rename of ‘.\sistema\venta’ to ‘.\sistema\#sql2-b5c
-21’ (errno: 152)

Bueno, pues lo unico que debes de hacer es primero eliminar el foreign key, y despues borrar el indice, para saber el nombre del foreign key puedes hacerlo viendo la estructura de la tabla ya sea con phpmyadmin o bien en consola con un show create table nombretabla, tomas el nombre del indice y le das un drop al FK de la siguiente manera:

alter table Datos_Facturacion drop foreign key FK_REFERENCE_90;

Despues corres este comando sustituyendo los datos de la tabla y el nombre del FK correspondiente a tu tabla:

`ALTER TABLE Datos_Facturacion DROP INDEX FK_REFERENCE_90`

Eso es todo lo que hay que hacer..

Ahora ya puedes hacer lo que desees con ese campo, borrarlo, cambiar el nombre, tipo ,etc.

Espero le sirva a alguien.

Obtener el numero de fila en una sentencia select

Googleando me encontre este blog http://lennyvpg.wordpress.com/tag/mysql

en el cual lei sobre como obtener el numero de renglon en una sentencia select, lo probe y si, es bueno el tip, y seria algo similar a esto:

select @row := @row + 1 as renglon, Orden_Compra.*
from Orden_Compra, (select @row:=0)r limit 10,15

Lo probe primero con limit 10, despues con limit 10,15, o s usando el offset para ver que resultados daba, y si, efectivamente da el numero de renglon de la consulta.

Como lo dice el blog, hace uso de variables definidas por el usuario @row

Importar CSV a una tabla de MYSQL

Lo copie tal y cual de esta entrada, pero para no andarlo buscando, mejor lo pongo en mi blog y hago referencia a la fuente:

http://www.eparreno.com/2008/02/20/importar-datos-de-un-archivo-csv-a-una-tabla-mysql/

y dice asi:

Importar datos de un archivo CSV a una tabla MySQL

February 20th, 2008

Existe la posibilidad de importar datos de un archivo CSV a una tabla de una base de datos MySQL. El proceso es muy sencillo; lo primero que debemos hacer es guardar el archivo en formato CSV, separando los valores por “;”. También se puede separar una coma, pero hay que tener en cuenta que si el texto de alguno de los campos contiene una coma, el proceso de importación entenderá que ha llegado al final de un campo y pasará al siguiente, con lo cual tendremos la información mal guardada. Es menos probable que encontremos un punto y coma que una coma. Si algún campo contiene estos dos caracteres podemos probar con otro símbolo para marcar la separación entre campos.

Una vez disponemos del archivo CSV entramos en la consola de MySQL desde el directorio donde hayamos guardado el archivo y ejecutamos:

LOAD DATA LOCAL INFILE 'archivo.csv'
INTO TABLE nombre_tabla
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(campo1, campo2, campo3);

No es necesario dejar campos en blanco para respetar la estructura de la tabla, el archivo CSV simplemente debe contener los campos que queremos importar y como podéis ver al final se especifica en que campos se debe guardar la información, eso sí, respetando el orden en que están en el archivo de importación.

Como Hacer un update entre dos bases de datos

Como actualizar un campo a partir del contenido de otro campo en otra base de datos:

Basta con un update similar al siguiente, notese el uso de alias para nuevabase.nombretabla y para basevieja.nombretabla, de esta manera con solo hace referencia al alias y especificar el nombre de campo, se hace mas sencilla la interpretacion.

UPDATE nuevabase.nombretabla n, basevieja.nombretabla o
SET n.nombrecampo =o.nombrecampo
WHERE n.idRegistro=16 AND o.idRegistro=16;

Como convertir un campo a varias columnas en mysql

Resulta que en ocasiones necesitamos que en una consulta de mysql, en vez de que nos arroje los datos de manera vertical, es decir registro a registro, necesitamos que cierto campo o campos, dependiendo de su valor, nos aparezca como una nueva columna, bueno, esto es muy facil usando la sentencia if.

Supongamos que tenemos una tabla asi:

Producto
id
estado_fisico
nombre

con los siguientes valores:

SELECT * FROM producto;

nos dara algo similar a:

id——–estado_fisico——–nombre
1————1————–Caramelos
2————2————–Platano
3————3————–Jabon

Pero si deseamos que nos de un resultado similar a este, es decir convertir un campo a varias columnas
dependiendo de su valor:

id–nombre——bueno——-regular————–malo
1–Caramelos—-1————-0——————0
2–Platano——0————-1——————0
3–Jabon——–0————-0——————1

nuestra consulta quedaria de la siguiente manera:

SELECT
id, nombre,
if(estado_fisico=1,1,0) as bueno,
if(estado_fisico=2,1,0) as regular,
if(estado_fisico=3,1,0) as malo
from producto

Muy util en algunas situaciones, o bien para luego convertir este resultado en una subconsulta, etc.