如何使用SQL从DB表中删除未使用的行?

时间:2011-12-15 12:09:19

标签: sql sqlite

我正在尝试从表中删除未使用的行。 这是我的问题的简化示例:

有2个表:

user table:

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


address table:

user_id    address
-----------------------
1          mike@abc.com        
3          carol@yyy.com
10         bob@example.com
3          carol@example.com

我想从地址表中删除未使用的地址。 如果用户表中存在地址的user_id,则该地址未使用。 示例表中有一个未使用的地址:bob@example.com。

我是SQL的新手,我的解决方案很难看:

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

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

使用sqlite。

2 个答案:

答案 0 :(得分:4)

这样做:

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

答案 1 :(得分:4)

在您的情况下,您应该考虑将user_id设置为user中的主键,并将其设置为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_id address.user_id“指向”已被删除。

如果您只想删除这些未使用的地址,那么您的解决方案应该可以正常工作。