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