Mysql, consulta registro sin integridad referencial
Rodrigo Fuentealba
the.code.keeper en gmail.com
Mar Sep 30 20:26:44 CLT 2008
Lorenzo Ponce <lekronne en yahoo.com> escribió:
> Estimados, en primer lugar, no sé si esta es la lista
> adecuada por lo que no vi una de base de datos,
> si no lo es, favor indicar (con una vez basta).
En general tratamos temas relacionados con bases de datos.
> Tengo una base de datos MyISAM (MySQL), y
> tengo la necesidad de rescatar datos de una
> tabla cuya integridad referencial no existe.
MyISAM... ¿por qué torturan tanto a la gente?
> Es sencillo sacar los que tienen su PK con la
> FK en otra tabla, WHERE idCampo=fkCampo,
> pero lo que quiero es sacar aquellos registros
> que NO tienen hecha la relación.
SELECT tabla1.campo FROM tabla1, tabla2 WHERE tabla1.campo1 NOT IN
(SELECT tabla2.campo2 FROM tabla2);
Eso, ¿cierto?.
http://dev.mysql.com/doc/refman/5.0/en/rewriting-subqueries.html
Haz un query rewrite como el que sigue:
SELECT tabla1.*
FROM tabla1 LEFT JOIN tabla2 ON tabla1.id=tabla2.id
WHERE tabla2.id IS NULL;
Con eso deberías tener un improvement.
> He intentado usando selects anidados y funciones
> como NOT IN, lo cual funciona bien con pocos registros
Querrás decir "funciona".
> pero al crecer la cantidad de registros se torna demasiado
> lento por los selects que debe hacer en cada vuelta.
El optimizador de MySQL es horrible.
> Me gustaría me indicaran alguna solución más eficiente.
> Me imagino que llenar de OR la consulta sería poco eficiente
> también.
Yo no veo la forma simple de hacerlo con OR. Por algo parecido mandé a
un tipo a repetir Bases de Datos I.
> Favor, omitir comentarios del tipo cámbiate a postgres,
> u otros, que no contribuyan a la solución de codificación
> requerida.
No te preocupes; no te cambies a PostgreSQL, si al total, son datos de
un cliente nada más, no importa ni integridad ni consistencia ni una
base de datos decente... (sarcásticamente hablando, claro).
Saludos,
--
Rodrigo Fuentealba
Más información sobre la lista de distribución Linux