如何使用SQL从DB表中删除未使用的行?
我正在尝试从表中删除未使用的行。 这是我的问题的简化示例: 有两个表:如何使用SQL从DB表中删除未使用的行?,sql,sqlite,Sql,Sqlite,我正在尝试从表中删除未使用的行。 这是我的问题的简化示例: 有两个表: user table: user_id user_name -------------------- 1 Mike 3 Carol 8 Eric address table: user_id address ----------------------- 1 mike@abc.com 3 carol@
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
我想从地址表中删除未使用的地址。
如果用户表中确实存在地址的用户id,则该地址未使用。
示例表中有一个未使用的地址:bob@example.com.
我是SQL新手,我的解决方案很难看:
DELETE FROM address
WHERE NOT EXISTS
( SELECT * FROM user WHERE address.user_id = user.user_id );
一定有更好的办法。
最好的方法是什么
使用sqlite。这样做:
DELETE FROM address
WHERE user_id NOT IN (SELECT user_id FROM user);
在您的情况下,您应该考虑在<代码>用户< />代码中设置<代码> USER ID /COD>作为主键,并在<代码>地址<代码>中作为外键。因此,如果您在
user
中删除一个用户,您可以在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
);
基本上,每个用户都有一个唯一的用户id
。如果删除其中一个用户,则地址
中的相应地址也将被删除,因为用户.user\u id
地址.user\u id
“指向”已被删除
如果您只想删除那些未使用的地址,您的解决方案应该可以正常工作。在我看来不太难看,您想改进什么-看,性能?我会这样做的。一旦设置了引用完整性,就不会再发生这种情况。如果你没有/不能拥有引用完整性,那么“丑陋”是你能拥有的最好的东西。@paul:我只是看看常见的做法,这个问题通常是如何解决的。此外,我还担心性能:似乎对select语句的搜索在地址表的每一行都进行了一次。@User1我知道这是一个老问题,但是否可以为这个not exists语句执行多个where子句?