2011-12-15 156 views
6

我想从表中删除未使用的行。 这是简化的例子,我的问题:如何使用SQL从数据库表中删除未使用的行?

有2表:

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] 

我想从地址表中删除未使用的地址。 如果用户表中存在user_id的地址,则该地址未被使用。 示例表中有一个未使用的地址:[email protected]

我是新与SQL,和我的解决办法是丑陋:

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

必须有更好的方式来做到这一点。 做什么是最好的方法?

使用sqlite。

+4

对我来说看起来不太难看,你想要改进什么 - 看,表现? – 2011-12-15 12:11:48

回答

4

做这样的:

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

在你的情况,你应该考虑设置user_iduser主键和为address外键。因此,如果您删除user中的某个用户,则可以设置ON DELETE CASCADE选项来自动删除地址中的关联行。

在创建你的表,你只需要做这样的事情:

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 
); 

基本上,每个用户都有一个唯一的user_id。如果删除其中一个用户,则address中的相应地址也将被删除,因为user.user_idaddress.user_id“指向”已被删除。

如果你只想删除那些未使用的地址,你的解决方案应该工作得很好。

相关问题