2011-12-15 61 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「指向」已被刪除。

如果你只想刪除那些未使用的地址,你的解決方案應該工作得很好。

相關問題