これは私が試すものです:
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;
(それが機能するかどうかはわかりません。関係テーブルが 2 回参照されるため、例外が発生する可能性があります。)
複数テーブルの更新が機能しない場合は、作業テーブルを作成し、作業テーブルに (更新する行を識別する) クエリを入力してから、作業テーブルを使用して複数テーブルの更新を実行します。
このクエリは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
は PRIMARY KEY が必要であり、relation_id のデータ型が同じである必要があります。)