2011-12-15 25 views
6

Tôi đang cố xóa các hàng không được sử dụng khỏi bảng. này được đơn giản hóa ví dụ về vấn đề của tôi:Làm thế nào để xóa các hàng không sử dụng từ bảng DB bằng cách sử dụng SQL?

Có 2 bảng:

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] 

Tôi muốn xóa địa chỉ không sử dụng từ bảng địa chỉ. Nếu user_id của một địa chỉ không tồn tại trong bảng người dùng, thì địa chỉ không được sử dụng. Có một địa chỉ không được sử dụng trong bảng ví dụ: [email protected]

Tôi mới với SQL, và giải pháp của tôi là xấu xí:

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

Phải có cách nào tốt hơn để làm điều đó. Cách tốt nhất để làm điều đó là gì?

sqlite được sử dụng.

+4

Không quá xấu với tôi, bạn muốn cải thiện điều gì - nhìn, hiệu suất? –

+0

Đó là cách tôi đã làm nó. Khi bạn đã thiết lập tính toàn vẹn tham chiếu, nó sẽ không xảy ra nữa. Nếu bạn không/không thể có toàn vẹn tham chiếu thì "xấu xí" là tốt nhất bạn có thể có. –

+0

@paul: Tôi chỉ đang tìm kiếm thông lệ, cách giải quyết vấn đề này. Ngoài ra, tôi đã lo lắng về hiệu suất: Dường như việc tìm kiếm câu lệnh chọn được thực hiện một lần cho mỗi hàng của bảng địa chỉ. – SKi

Trả lời

4

Làm điều đó như thế này:

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

Trong trường hợp của bạn, bạn nên xem xét việc thiết user_id như khóa chính trong user và như là một khóa ngoại trong address. Do đó, nếu bạn xóa một trong những người dùng của mình trong user, bạn có thể đặt tùy chọn ON DELETE CASCADE để tự động xóa các hàng được liên kết trong địa chỉ.

Trong việc tạo ra các bảng, bạn chỉ cần làm một cái gì đó như thế này:

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 
); 

Về cơ bản, mỗi người dùng có một độc đáo user_id. Nếu bạn xóa một trong những người dùng đó, địa chỉ tương ứng trong số address cũng sẽ bị xóa vì user.user_idaddress.user_id "điểm đến" đã bị xóa.

Nếu bạn chỉ muốn xóa những địa chỉ không sử dụng đó, giải pháp của bạn sẽ hoạt động tốt.

Các vấn đề liên quan