Элегантный способ удаления сиротских строк?

У меня есть таблица с большим количеством записей истории, содержащих идентификаторы клиентов.

Существует отдельная таблица клиентов. Иногда некоторые из записей клиента удаляются.

Есть ли простой способ, не зацикливая каждую запись истории, удалить все строки в таблице истории, где идентификатор клиента больше не существует, потому что строка клиента была удалена?

Ответ 1

delete from history_table where customer_id not in (select customer_id from customers)

Вы имели в виду что-то вроде этого?

Ответ 3

Как насчет:

DELETE FROM history_table 
WHERE customer_id NOT IN (SELECT customer_id FROM customer);

Ответ 4

Для этого вы можете использовать каскадирование с помощью внешних ключей. В следующем примере, в любое время, когда строка удаляется из A или изменяется A_ID в A, это изменение будет автоматически отражено в таблице B. Вы можете узнать больше о внешних ключах в документации MySql.

CREATE TABLE A(
   A_ID INT, 
   PRIMARY_KEY(A_ID)
) TYPE=InnoDB;

CREATE TABLE B(
   B_ID INT,
   A_ID INT,
   CONSTRAINT FK_B_A FOREIGN KEY REFERENCES A(A_ID) ON DELETE CASCADE ON UPDATE CASCADE,
   PRIMARY_KEY(B_ID, A_ID)
) TYPE=InnoDB;

Ответ 5

DELETE FROM CUSTOMER_HISTORY CH
WHERE NOT EXIST (SELECT 1 FROM CUSTOMER C WHERE C.CUSTOMER_ID = CH.CUSTOMER_ID)