MySQL
MySQL es un gestor de bases de datos bastante popular y rápido. Normalmente lo puedes encontrar instalado en los sitios de hosting.
Como programador autodidacta, reconozco que hay aspectos en los que puedo mejorar. Uno de ellos es el diseño de las bases de datos. Siempre me hablaron de la importancia de relacionar las tablas utilizando claves foráneas (FOREIGN KEY) para imponer restricciones y garantizar la integridad de los datos. Sin embargo, siempre descarté esta práctica, prefiriendo gestionar las relaciones directamente en el código de mis aplicaciones.
Con el tiempo, me di cuenta de que esta no era la mejor práctica. Al no definir relaciones explícitas en la base de datos, las aplicaciones externas, como Power BI o Metada, tenían dificultades para comprender la estructura de la base de datos. Esto dificultaba su reutilización y análisis, ya que carecían de la información necesaria sobre cómo las tablas estaban relacionadas entre sí.
Otra cosa que también descubrí fue la importancia de comentar los campos de la base de datos. A menudo, los nombres de los campos pueden no ser lo suficientemente descriptivos por sí mismos, lo que puede dificultar la comprensión de su propósito. Al comentar los campos con información adicional, facilitamos la auditoría de la base de datos y evitamos confusiones innecesarias.
Es por eso que en esta guía, exploraremos cómo diseñar una base de datos MySQL de manera coherente y consistente, utilizando claves foráneas para establecer relaciones y mejorar la comprensión y el análisis de nuestros datos en diversas aplicaciones.
Importar mdb desde consola con mdb-export
Lo primero tendenemos que tener instalado mdbtools en nuestro sistema.
Para instalar en debian:
sudo apt-get -y install mdbtools
A continuación ponemos un fichero que tenemos crear bash para poder hacer exportacion de una forma sencilla.
#!/bin/bash
echo "Esquema"
mdb-tables $1.mdb all > $1.tablas
mdb-schema $1.mdb > $1.schema.sql
echo "Tablas"
echo "==========================="
arr=( $(cat $1.tablas) )
# read -a arr
for elem in ${arr[@]}
do
# mdb-export -I mysql $1.mdb $elem > $elem.sql #tablas individuales
mdb-export -I mysql $1.mdb $elem >> $1.data.sql # todas las tablas juntas
done
Para un "archivo.mdb" se exportan sus tablas.
se ejecuta con:
bash tablas.sh archivo
Siendo "archivo" el fichero mdb que quieres exportar, sin la extensión, para mySQL hay que hacer unos cambios básicos de tipos "Long Integer" por "bigint" y cosas así, pero lo gordo está hecho.
Muchas gracias por aporte Alberto Lago. :-)
Realizando el proyecto catalogos, necesito poder crear una consulta donde me cambie el valor de una columna en unas determinadas filas.
Lo que tengo montado hasta ahora es un array con las consultas.
$consulta[$i] = 'UPDATE referenciascruzadas SET Estado ="'.$Estado.'" WHERE RecambioID ='.$Encontrado['RecambioID'].' AND IdFabricaCruzado ='.$Encontrado['IdFabricaCruzado'].' AND Ref_Fabricante ="'.$Encontrado['Ref_Fabricante'].'"';
Pero esto implica que si tengo un array con 200 elementos, implica que haga 200 peticiones al servidor msqyl, algo que considero que es innecesario, ya que no necesito saber si fue correcta o no la actualización.
Bueno el código completo es el siguiente
foreach ( $ArrayEncontrados as $Encontrado) { $i++; if ($Encontrado['Buscado'] =='NoEncontrado') { $Estado = 'Nuevo'; } else { $Estado = 'Existe Referencia Cruzada'; } $consulta[$i] = 'UPDATE referenciascruzadas SET Estado ="'.$Estado.'" WHERE RecambioID ='.$Encontrado['RecambioID'].' AND IdFabricaCruzado ='.$Encontrado['IdFabricaCruzado'].' AND Ref_Fabricante ="'.$Encontrado['Ref_Fabricante'].'"'; }
La mayoria de estos comando son ejecutables de phpmyadmin, aunque realmente esto esta estudiado para hacer desde la propia terminal Mysql
Comando SHOW
El comnando SHOW nos proporciona la información de las bases de datos, tablas, columnas o información de estado sobre el servidor de Mysql.
show databases
Nos muestra un listado de todas las bases de datos que tenemos disponibles en ese usuario.
Si estamos en prompt de una base de datos, ya podemos listas las tablas, con :
show tables
Nos muestra todas las tablas de esa base datos.
Comando SELECT
Este comando es el mas utilizado, el que se utiliza para consultar.
Saber el peso de una base de datos
SELECT TABLE_SCHEMA AS `Database`,
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS `Size (MB)`
FROM information_schema.TABLES
WHERE TABLE_SCHEMA="<database name>";
No indica el peso de la Database ( este nombre debemos cambiarlo por el nuestra base de datos)
Saber el peso de todas las bases de datos
SELECT TABLE_SCHEMA AS `Database`,
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS `Size (MB)`
FROM information_schema.TABLES
GROUP BY TABLE_SCHEMA
ORDER BY SUM(DATA_LENGTH + INDEX_LENGTH) DESC;
No lista todas la base de datos que tengamos con su peso.
¿Queremos contar los distintos valores que tenemos en un campo?
Imagina que tienes un campo con los nombres y quieres saber cuantos nombres diferentes hay.
SELECT count(DISTINCT `NombreCampo`) as variable FROM `NombreTabla`
Imagina que tarifa de precios con los siguiente campos:ReferenciaProducto, ReferenciaFamilia, IdCliente, Precio. Hay que tener en cuenta que las ReferenciasProductos pueden estaŕan duplicada ya que tenemos un precio para cada cliente.
Ahora queremos saber cuantos productos hay en cada familia en esta tabla, no da igual que tengan precios distintos, solo queremos saber el numero de productos en cada familia.
SELECT count(DISTINCT `NombreCampo`) as variable FROM `NombreTabla` where `ReferenciaFamilia`= FAMILIAQUEREMOSSABER
Comando UPDATE
La comando UPDATE es la sentencia para actualizar registros de una tabla. Nos permite elegir los campos a actualizar y los datos. Son registros que ya existen.
Sustituir contenido de un campo por otro.
Lo ideal para hacer esto es con funcion replace que no facilita mysql, si quiere ver todas las funciones que tiene en este link: Funciones de mysql.
UPDATE nombretabla SET campo = REPLACE(campo*, 'palabra', 'palabra_remplazada');
En esta sentencia lo que hace es cambiar en la tabla "nombretabla" en todos lo registros, en el campo busca en valor del campo (campo* -> se pondría el campo) las 'palabras' y las sutituye por 'palabra_remplazada'
Comando INSERT
Tienes la necesidad de copiar los datos de una tabla en otra de otra BD
INSERT INTO `NUEVA-BASEDATOS`.`TABLA-NUEVA` SELECT * FROM `BASEDATOS`.`TABLAQUEREMOSCOPIARDATOSo`
Recordar que la estructura tiene que ser la misma
Dbf (Data Base File) es formato simple para almacenar datos estructurados, utilizado por Dbase, Paradox, Clipper, FoxPro y seguro que nos olvidamos de alguno más.
Por esto, puede que os surja la necesidad de convertir esas tablas en una tabla de mysql, por ello en esta entrada vamos a ver las opciones que utilizamos.
DESDE LA PROPIA CONSOLA DE LINUX:
Desde la propia terminal de linux es bastante sencillo, solo necesitamos dbf2mysql.
Utilizando dfb2mysql, instalando en UBUNTU
sudo apt-get install dbf2mysql
Una vez lo tengamos instalado , solo tenemos que crear la BD en mysql, y luego con la siguiente instruccion:
dbf2mysql -h [SERVIDOR] -U [USUARIO] -P [CONTRASEÑA] -d [BASEDATOS] -t [NOMBRETABAL] -c -f /path/del/fichero/nombrefichero.dbf
No es un proceso rápido y por lo que la duración del proceso puede ser largo ya que depende de los registros y lo pesada que sea la tabla, como referencia os indico que:
" Duro un par de horas el importar una tabla 250.000 registros en servidor local "
Con esto, os digo que toca esperar a que termine el comando en la terminal antes de cerrarlo , ya que sino vuestra tabla puede que no este completa.
Problemas encontrados:
- Algunos atributos que tiene dbf no los tiene en cuenta , como el auto incremento
- Algunos tipos de campos con decimales no los importa correctamente.
Referencias:
-Blog de manel perez
-Github un proyecto con modificaciones dbf2mysql
Importar dbf con python
Cuando la cosa se nos pone compleja a la hora importar dbf, lo que hacemos es utilizar Python y una librería llamada dbfread, la cual nos permite leer los dbf , luego con un pequeño script podemos tratar los datos leido y añadirlos a donde queramos.
Referencias:
Documentacion libreria dbfread.
Teniendo en cuenta que tienes que ser administrador del equipo y la versió MYSQL que tengo es 5.5.40-0ubuntu0.12.04.1 encontre la siguiente web donde lo explica muy bien.
Lo repito por ecapy.com se les da por quitar el post o otros.
Paramos el servidor:
sudo service mysql stop
Arrancamos “mysqld_safe”:
sudo mysqld_safe --skip-grant-tables
Dejamos esa consola con “mysqld_safe” corriendo. Abramos otra consola y hagamos lo siguiente:
sudo mysql -u root
Con esta nota de mysql queremos conseguir una pequeña guia para utiliza mysql desde terminal, al final del post podrás encontrar una relación de fuentes.
Paquetes necesarios para la instalación de MySql en Linux
Se necesitán varios paquetes para poder tener totalmente operativo myqsl en nuestro equipo.
- mysql-server : Paquete Servidor de MYSQL
- mysql-common : Paquete archivos comunes de MySql
- mysql-client: Paquete de Cliente de MYSQL
Tambien puede instalarte paquetes adicionarles como::
- mysql-admin : Paquete entorno gráfico
- mysql-query-browser: Paquete que sirve para hacer consultas.
Conectarnos a mysql desde terminal
Lo primordial tener los datos conexion : usuario, contraseña y host.
Si tienes MariaBD en un sistema local, puedes configurar el servicio para que no tengas que poner la contraseña cuando esta con root.
mysql -u root -p
Si no es un sistema local, es decir no queremos conectar a un servidor de bases datos (MariaDB o MYSQL) debemos incluir en la instrucción el servidor
mysql -u USUARIO -p -h SERVIDOR
A continuacion nos pide la contraseña que del usuario, si es root no pide la pusimos en la instalación, una vez introducida nos aparece los siguiente o algo similar si va todo correcto.
Type 'help;' or '\h' for help.
Type '\c' to clear the current input statement.
mysql>
Para desconectarse de terminal, utilizamos
Lee más…