Это то, что я хотел бы попробовать:
UPDATE relations r
LEFT JOIN relations s
ON r.relation_id = s.id
SET r.relation_id = NULL
WHERE s.id IS NULL
AND r.relation_id IS NOT NULL;
(я не уверен, что будет работать, что может вызывать исключение, потому что таблица отношений ссылается дважды.)
Если обновление с несколькими таблицами не работает, я бы создал рабочую таблицу, заполнив рабочую таблицу запросом (который идентифицирует строки, которые необходимо обновить) а также затем выполните обновление с несколькими таблицами, используя рабочую таблицу.
Этот запрос будет идентифицировать те строки, которые имеют relation_id
, что не указывает на существующий id
:
SELECT r.*
FROM relations r
LEFT JOIN relations s
ON r.relation_id = s.id
WHERE s.id IS NULL
AND r.relation_id IS NOT NULL;
Вам не нужно тянуть все столбцы, только первичный ключ. (Я здесь при условии, что первичный ключ является один столбец id
.)
CREATE TABLE work_table (id int PRIMARY KEY);
INSERT INTO work_table (id)
SELECT r.id
FROM relations r
LEFT JOIN relations s
ON r.relation_id = s.id
WHERE s.id IS NULL
AND r.relation_id IS NOT NULL;
UPDATE relations r
JOIN work_table s
ON r.id = s.id
SET r.relation_id = NULL;
DROP TABLE work_table;
Добавление:
Если вы используете InnoDB, вы можете избежать такого рода проблем целостности данных в будущее, определяя ограничение внешнего ключа. Например:
ALTER TABLE relations ADD CONSTRAINT relations_FK
FOREIGN KEY (relation_id) REFERENCES relations(id)
ON UPDATE CASCADE ON DELETE SET NULL;
Это будет запрещать изменения в таблицу, которая приведет к relation_id
, имеющий значение, отличное от значения id
, которая существует в таблице. (Для этого требуется, чтобы id
был ПЕРВИЧНЫМ КЛЮЧОМ, и этот тип отношения имеет идентичный тип данных.)
Вы уверены, что можете удалять таблицу, используя подзапрос себе? – Sebas
MySQL сказал: # 1093 - Вы не можете указать ссылки на целевую таблицу для обновления в предложении FROM. – Pepijn
. Вы вручную вводите отношения_и_ через форму или myPhpAdmin?обычно это автоматические номера, поэтому вы не должны их касаться. –