Как удалить неиспользуемые строки из таблицы БД с помощью SQL?
Я пытаюсь удалить неиспользуемые строки из таблицы. Это упрощенный пример моей проблемы:
есть 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 является.2 ответов
в вашем случае, вы должны рассмотреть вопрос о создании 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
"точки" был удален.
если вы хотите удалить только эти неиспользуемые адреса, ваше решение должно работать нормально.