Acepto que este no es un problema al que me enfrento todos los días y menos en este gestor de bases de datos. En los demás motores como Oracle y PostgreSQL no había tenido ese problema (hasta donde recuerdo). Pero hoy tuve la necesidad de eliminar algunos registros duplicados de una tabla de un cliente (él deseaba eliminar los registros duplicados de sus clientes).
Al solicitarme el trabajo procedí a usar una sentencia del estilo: DELETE FROM Customer cc WHERE cc.email IN ( SELECT c.email FROM Customer c ... HAVING count(c.email)>1 )
Sencillo, práctico e intuitivo, ¿no? Le digo al gestor de base de datos que elimine los registros de la tabla Customer que tienen más de una incidencia. Pero tal fue mi sorpresa que me encontré con el siguiente error: Error: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cc WHERE cc.email IN (SELECT c.email FROM Customer c' at line 1
Y en algún momento me encontré con un error como: #1093 - You can't specify target table 'Customer' for update in FROM clause
Así que entonces empezó la labor de investigación (¿o quise decir el dolor de cabeza?). Luego de visitar una buena cantidad de páginas web relacionadas, la documentación de MySQL (que por cierto no menciona qué hacer en esos casos), encontré que situaciones como la que necesitaba se resuelve con una eliminación relacional (algo que creo solo existe en MySQL/MariaDB). Para mi caso la consulta quedó así: DELETE FROM Customer
USING Customer, Customer as c
WHERE (NOT Customer.id=c.id)
AND (Customer.email=c.email)
¿Alguna duda? Sé que no es tan intuitiva como la primera sentencia, pero luego de revisarla detenidamente tuvo sentido para mí. Básicamente lo que hace la sentencia es decir que elimine de Customer haciendo una relación con Customer (con la misma tabla) en donde el ID sea diferente y el email se igual.
Espero ahorrarles la búsqueda y desde luego dolores de cabeza.
Navegando y leyendo noticias aquí y allá, me he encontrado con un sistema denominado AeroSQL que promete ser una alternativa profesional a entornos como phpMyAdmin, MySQL Query Browser, EMS SQL Manager for MySQL, y SQLyog, solo que funciona en entornos web, es decir, no importa en qué plataforma se requiere porque se ejecuta sobre un servidor web con soporte de PHP.
Mi primera impresión fue bastante agradable, porque luce bastante profesional y su interfaz me recuerda a la interfaz de EMS SQL Manager, además, permite editar los contenidos de las tablas directamente sobre las tablas mismas o sobre el resultado de las consultas SQL ejecutadas.
AeroSQL está desarrollado en PHP con el framework ExtJS (para AJAX), soporta conexiones a múltiples servidores y múltiples bases de datos, el entorno es bastante agradable y corre sobre cualquier servidor web. El entorno es bastante usable, aún carece de funciones importantes para su adminsitración como crear tablas, eliminar tablas, renombrar tablas (lo mismo para las bases de datos e índices). Personalmente lo encuentro bastante prometedor y no está mal exharle un ojo al progreso del desarrollo pues creo que ya es hora de analizar alternativas al amo y señor de la gestión de bases de datos MySQL phpMyAdmin.
En esta versión incluye varias mejoras y adiciones importantes:
- Nuevo módulo de importación y exportación: Optimizados y con varios bugs corregidos.
- Seguimiento y registro de cambios.
- Sincronización de estructura y datos entre servidores: el cual habíamos probado hace algunos días.
- Soporte de replicación
Y otros cambios menores y varias optimizaciones en el sistema interno. Vale la pena probarlo, no he encontrado problemas o bugs relevantes que puedan afectar nuestro trabajo o que vayan a echar a perder nuestras bases de datos (de hecho no he encontrado ningún error, podría pasar por una versión estable).
Excelente noticia y excelentes adiciones realizadas por el equipo de phpMyAdmin.
Luego de trabajar con costosas configuraciones de SQL Server y Oracle la gran mayoría de mi carrera profesional, casi siempre defendiendo estas alternativas de forma “viciada” a capa y espada es difícil abrir los ojos y ver otras opciones, especialmente por esa “propaganda” que apoya la idea (ahora extinta) que: SQL Server y/o Oracle son (o fueron) las mejores elecciones o alternativas de base de datos para la organización. Y creo que muchos solemos ser los “abogados” de las bases de datos comerciales.
Tal vez, estas bases de datos nos han dado de comer durante muchos años, no hay duda, incluso seamos profesionales, tal vez no expertos, pero sí profesionales en el manejo de estos motores, que muchas veces hemos tratado a los demás como “herejes” por no aceptar “la verdad”. Y así como hay profesionales “adictos” a estas bases de datos también, están quienes les guardan distancia por distintas razones.
¿MySQL? Por favor, ¿se están burlando?. ¿PostgreSQL?, Gracias, aunque es en proyecto serio, necesitamos una base de datos de la que podamos depender y confiar.
Suenan familiares las frases anteriores, ¿verdad?.
¿Cuántas veces hemos llevado a cabo algún “análisis” para determinar si, de hecho, SQL Server y/o Oracle eran las mejores elecciones no para mí, sino para el equipo, el cliente, el empleador y la organización?
0
Y si hemos realizado con diligencia esos análisis, ¿Qué hemos aprendido? Dos cosas:
SQL Server y Oracle son realmente bases de datos excelentes. (Está bien, eso ya lo sabíamos.)
SQL Server y Oracle son una elección errónea para el 95% de las necesidades de almacenamiento de datos, incluso a nivel empresarial.
Hoy en día, es agradable pensar en SQL Server y Oracle como las Estrellas de la muerte del universo de las bases de datos relacionales (para decirlo en términos de la Guerra de las Galaxias), es decir, extremadamente poderosas, monolíticas, brillantes, complejas casi más allá de la comprensión que una simple mente humana pueda llegar a tener, y que significan un gasto monumental de dinero excepto en esas raras situaciones cuando se necesita destruir un planeta.
He podido ver (al menos) a una docena de compañías derrochando dinero en bases de datos que no necesitan, impactando y confundiendo sus balances finales con esquemas de licencias que adornan las oficinas, perpetuando así la Falacia del Software de Marca:
En igualdad de condiciones, y asumiendo que se tiene el presupuesto, generalmente se prefiere un costoso (por no decir caro) bien “ajustado” producto comercial como [inserte el producto comercial aquí] a análogos más económicos [inserte producto open-source o de precio razonable aquí]. Los desarrolladores del proyecto XYZ usaron [costoso producto comercial], nuestro XYZ interno usa [producto comercial costoso], ergo, nueva política de la compañía: se utiliza [producto comercial costoso]. Claro, a $89,000 por licencia, [producto comercial costoso] es un poco costoso, pero a quién estamos engañando? Gastamos [inserte un monto realmente ridículo de dinero solo disponible en Monopoly aquí] en IT cada año.
Está bien claro, se ha gastado una cantidad ridícula de dinero en IT. Alguna vez se ha preguntado por qué?
Veamos el siguiente ejemplo en este cuadro (Está inglés pero creo que es bastante claro):
Por qué comprometer su proyecto, su organización, su imperio, para construir y mantener una “Estrella de la Muerte” cuando lo que realmente necesita es una nave X-Wing, un AT-AT, o por mucho, un Destructor de Estrellas? Especialmente dado que:
La gran mayoría de aplicaciones no necesita las capacidades de las últimas, grandes y majestuosas versiones de las base de datos de Microsoft y Oracle .
Firebird SQL, PostgreSQL y MySQL son 100% gratis (en el caso de MySQL hay una versión comercial) lo que significa que, sí eso mismo, no más fatalidad económica a causa de licencias comerciales. (Claro, cabe mencionar que Oracle ahora es dueño de Sun y por ende controla a MySQL.)
Oracle y SQL Server tiene características más potentes que MySQL o PostgreSQL o Firebird o cualquier otra base de datos de código abierto. Tienen una funcionalidad más integrada. Nadie podría afirmar lo contrario. Pero son los desarrolladores y DBAs y las personas que toman las decisiones de compra totalmente conscientes (por ejemplo) tan solo de cuán ricas y poderosas son las características técnicas de PostgreSQL?
Una base de datos de clase empresarial, PostgreSQL cuenta con sofisticadas funciones como el control de concurrencia multi-versión (MVCC), puntos de restauración en el tiempo, tablespaces, replicación asincrónica, transacciones anidadas (savepoints), copias de seguridad en línea/en caliente, un sofisticado analizador/optimizador de consultas, y un sistema write ahead para la tolerancia a fallos. Es compatible con conjuntos de caracteres internacionales, codificación de caracteres multibyte, Unicode, y tiene en cuenta la configuración regional para el ordenamiento, sensibilidad a mayúsculas y minúsculas, y formateo. Es altamente escalable, tanto en la enorme cantidad de datos que puede manejar como en el número de usuarios concurrentes que puede gestionar. Hay sistemas PostgreSQL activos en entornos de producción que manejan 4 terabytes de datos sin problemas.
Dejando las configuraciones de PostgreSQL a un lado, están los desarrolladores conscientes de que MySQL tiene más 11 millones de instalaciones incluyendo gigantes tales como Facebook, YouTube, Flickr, y Wikipedia? Claro, Todo el mundo lo sabe. MySQL se ejecuta en la web, cierto? Entonces, realmente necesitamos el soporte de visualización hiper-cúbica cuatri-dimensional de las bases de datos comerciales cuando las necesidades en datos de la mayoría de organizaciones es modesta, y cuando las dos o tres bases de datos de código abierto han comprobado repetidamente sus capacidades y temple?
No.
No a menos que su necesidad pertenezca al 1% de los escenarios, aprovechando las características únicas de las bases de datos propietarias Oracle/SQL Server. (En tal caso, puede que tenga otro tipo de problema.)
De lo contrario la respuesta es simplemente: no.
Pero no permita que eso lo detenga! Por todo los medios, si usted está en un contrato gubernamental sobrecosteado donde desperdiciar dinero es fomentado, adelante y despréndase de ese dinero que le hace tanto estorbo y adquiera una de esas costosas bases de datos cerradas. Si cuando Microsoft o Oracle dicen “salte!” su organización dice “qué tan alto?”, prosiga y cierre el trato adquiriendo esa licencia costosa de plataforma “superior”. Si su organización está dominada por un montón de bocones aspirantes a evagelistas de tecnología que llevan a cabo una agenda personal, como generalmente es el caso, entonces probablemente no hay mucho que usted pueda hacer en este caso.
Pero si ud cuida el dinero, si cree que…
No! NO está bien desperdiciar una cuarto de millón de dólares al año en licencias de bases de datos a pesar de que el presupuesto IT esté en decenas de millones…
… y si tiene actualmente tiene el poder para influenciar sobre las decisiones de compra, entonces utilice bases de datos de código abierto siempre que le sea posible, y bases de datos comerciales cuando absolutamente deba hacerlo.
Entre mis labores diarias consulto y modifico bases de datos MySQL, PostgreSQL y Firebird principalmente, y hoy me he llevado una sorpresa bastante agradable cuando abrí phpMyAdmin.
Entre los scripts que tengo programados para ejecución automática en mi equipo está uno que consulta actualizaciones de diferentes programas y paquetes en los diferentes repositorios SVN, Mercurial o GIT y descarga las últimas actualizaciones del paquete en cuestión, en este caso de phpMyAdmin 3.3.0-dev ha bajado la última versión de desarrollo del SVN y me he encontrado con una nueva pestaña: “Synchronize” (Sincronizar para las versiones en castellano).
Nueva pestaña sincronizar disponible en phpMyAdmin 3.3.0
Como buen ingeniero no pude aguantarme las ganas y di click en la pestaña para probar esa nueva opción y me encontré con una página sencilla pero bastante intuitiva.
Contenido página Sincronizar en phpMyAdmin 3.3.0
Luego de investigar de seleccionar una base de datos local y crear una de prueba vacía de destino decidí continuar haciendo click sobre el botón Go. Ahora me sorprende con una nueva página: la página de comparación de las bases de datos.
Selección de opciones a sincronizar en phpMyAdmin: datos y/o estructura
Puedo probar cómo efectivamente ha comparado no solo la estructura de las tablas sino también de los datos permitiendo agregar los registros faltantes a la base de datos destino. Al hacer click sobre el botón “Apply selected changes” (Aplicar cambios seleccionados) y curiosamente hace exactamente eso, ejecuta las consultas y regresa a la página de comparación. Luego de hacer click sobre el botón “Synchronize databases” ejecuta los cambios que hayamos seleccionado y muestra un informe con las sentencias SQL que se ejecutaron. En mi caso ejecutó todo sin errores ni problemas.
Les invito a probar esta nueva utilidad, parece que los desarrolladores de phpMyAdmin han escuchado nuestras plegarias y han visto nuestras necesidades. Vaya que han desarrollado una utilidad excelente: fácil, sencilla y hace exactamente lo que dice.
Qué otro módulo sería interesante tener en phpMyAdmin? No sería mala idea hacerles unas cuantas recomendaciones al equipo de desarrollo. Seguiré probando y les contaré alguna novedad.