Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL从DB表中删除未使用的行?_Sql_Sqlite - Fatal编程技术网

如何使用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子句?