我正在尝试从表中删除未使用的行。 这是我的问题的简化示例:
有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。
答案 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
“指向”已被删除。
如果您只想删除这些未使用的地址,那么您的解决方案应该可以正常工作。