Как удалить неиспользуемые строки из таблицы БД с помощью SQL? - PullRequest
6 голосов
/ 15 декабря 2011

Я пытаюсь удалить неиспользуемые строки из таблицы.Это упрощенный пример моей проблемы:

Есть 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 ]

4 голосов
/ 15 декабря 2011

В вашем случае вам следует рассмотреть возможность установки 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 "указывает на" был удален.

Если вы хотите удалить только эти неиспользуемые адресаваше решение должно работать нормально.

4 голосов
/ 15 декабря 2011

Сделайте это так:

DELETE FROM address
    WHERE user_id NOT IN (SELECT user_id FROM user);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...