2010-06-10 52 views
2

如果我在MySQL中有一個與外鍵相關的Parent和Child表,是否可以使用SQL語句將Parent中的某些行以及Child中的相關行移動到歸檔表中例如Parent_Archive和Child_Archive)以原子方式?在MySQL中存檔父/子表層次結構

回答

1

使用事務 - 它們的整個目的是使SQL語句的系列原子化。

例如(NOT非常優化的 - 可以用臨時表加以改進):

START TRANSACTION; 

INSERT Child_Archive 
SELECT DISTINCT 
Child.* FROM Child, Parent 
WHERE Child.FK = Parent.PK 
    AND Parent.something=11; 

DELETE Child WHERE FK IN (
    SELECT DISTINCT PK FROM Parent WHERE Parent.something=11); 

INSERT Parent_Archive 
SELECT DISTINCT * FROM Parent WHERE Parent.something=11; 

DELETE Parent WHERE Parent.something=11; 

COMMIT; 
+0

假設Parent_Archive和Child_Archive具有相同的FK約束作爲父母與孩子,不會在第一插入失敗,因爲父ISN還沒有? – 2010-06-11 00:14:00

+0

@Eric J. - 它會的。我不確定歸檔表爲什麼會有這樣的限制,儘管(我不會把它放進去)。如果這是設計,那麼解決方案就是我上面提到的「更好的表現」 - 您可以創建一個臨時PK/FK表來先存檔,然後按照您提到的順序重新排序上面的查詢(插入P_A,插入C_A,刪除C,刪除P) – DVK 2010-06-11 01:45:18