2011-12-15 14 views
6

Estoy tratando de eliminar las filas sin usar de una tabla. Esto se ejemplo de mi problema simplificado:¿Cómo borrar las filas no utilizadas de la tabla de base de datos mediante el uso de SQL?

hay 2 tabla:

user table: 

user_id user_name 
-------------------- 
1   Mike 
3   Carol 
8   Eric 


address table: 

user_id address 
----------------------- 
1   [email protected]   
3   [email protected] 
10   [email protected] 
3   [email protected] 

Quiero eliminar las direcciones no utilizadas de la tabla de direcciones. Si user_id de una dirección existe en la tabla de usuario, entonces la dirección no se usa. Hay una dirección no utilizada en la tabla de ejemplo: [email protected]

Soy nuevo con SQL, y mi solución era fea:

DELETE FROM address 
    WHERE NOT EXISTS 
    (SELECT * FROM user WHERE address.user_id = user.user_id); 

Tiene que haber una mejor manera de hacerlo. ¿Cuál es la mejor manera de hacerlo?

sqlite se utiliza.

+4

No me parece demasiado feo, ¿qué quiere mejorar? ¿Mirar, el rendimiento? –

+0

Así es como lo habría hecho. Una vez que haya configurado la integridad referencial, no volverá a suceder. Si no puede/no puede tener integridad referencial, entonces "feo" es lo mejor que puede tener. –

+0

@paul: Solo estoy buscando una práctica común, cómo este problema generalmente se resuelve. Además, estaba preocupado por el rendimiento: parece que la búsqueda de la declaración de selección se realiza una vez por cada fila de la tabla de direcciones. – SKi

Respuesta

4

hacerlo de esta manera:

DELETE FROM address 
    WHERE user_id NOT IN (SELECT user_id FROM user); 
4

En su caso, usted debe considerar el establecimiento de user_id como clave principal en user y como clave externa en address. Por lo tanto, si elimina uno de sus usuarios en user, puede establecer una opción ON DELETE CASCADE para eliminar automáticamente las filas asociadas en la dirección.

Durante la creación de la tabla, solo tiene que hacer algo como esto:

CREATE TABLE user (
    user_id INTEGER, 
    user_name VARCHAR(30), 
    PRIMARY KEY (user_id) 
); 

CREATE TABLE address (
    user_id INTEGER, 
    address VARCHAR(30), 
    PRIMARY KEY (user_id, address), 
    FOREIGN KEY (user_id) REFERENCES user(user_id) 
    ON DELETE CASCADE 
); 

Básicamente, cada usuario tiene un único user_id. Si elimina uno de esos usuarios, también se eliminarán las direcciones correspondientes en address ya que se borró el user.user_idaddress.user_id "puntos a".

Si solo quiere eliminar esas direcciones no utilizadas, su solución debería funcionar bien.

Cuestiones relacionadas