Ответ 1
delete from history_table where customer_id not in (select customer_id from customers)
Вы имели в виду что-то вроде этого?
У меня есть таблица с большим количеством записей истории, содержащих идентификаторы клиентов.
Существует отдельная таблица клиентов. Иногда некоторые из записей клиента удаляются.
Есть ли простой способ, не зацикливая каждую запись истории, удалить все строки в таблице истории, где идентификатор клиента больше не существует, потому что строка клиента была удалена?
delete from history_table where customer_id not in (select customer_id from customers)
Вы имели в виду что-то вроде этого?
DELETE h.* FROM history h
LEFT JOIN customer c ON h.customer_id = c.id
WHERE c.id IS NULL
Я печатаю это с самого начала, но вы надеетесь получить эту идею.
Как насчет:
DELETE FROM history_table
WHERE customer_id NOT IN (SELECT customer_id FROM customer);
Для этого вы можете использовать каскадирование с помощью внешних ключей. В следующем примере, в любое время, когда строка удаляется из 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;
DELETE FROM CUSTOMER_HISTORY CH
WHERE NOT EXIST (SELECT 1 FROM CUSTOMER C WHERE C.CUSTOMER_ID = CH.CUSTOMER_ID)