這是我想嘗試:
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
是PRIMARY KEY,並且relation_id具有相同的數據類型。)
您確定可以使用子查詢自行更新表嗎? – Sebas
MySQL說: #1093 - 您無法在FROM子句中指定目標表'關係'進行更新 – Pepijn
您是通過表單還是myPhpAdmin手動輸入relations_id?通常這些都是自動編號,所以你不應該碰它們 –