2012-04-13 10 views

答えて

17

スキーマを制御できる場合は、スキーマにcascading deletesを使用します。記事(あなたの例のために翻訳され、より適切な部分)

CREATE TABLE point 
(
    pt_id integer PRIMARY KEY, 
    evt_id integer REFERENCES event ON DELETE CASCADE 
) 

から

あなたが設定カスケードを持っている場合は、あなただけのメインイベント表から削除することができ、他のすべてのテーブルがクリーンアップされますが自動的に

それ以外の場合は、最初にすべての参照を削除してからメインテーブルを削除する必要があります。あなたは

BEGIN; 
DELETE FROM trace WHERE EXISTS 
    (SELECT 1 FROM point WHERE evt_id = 1139 AND trace.pt_id = point.pt_id); 
DELETE FROM point where evt_id = 1139; 
DELETE FROM magnitude where evt_id = 1139; 
DELETE FROM event where evt_id = 1139; 
COMMIT; 
-3
$delete = 1139; 
$query = "DELETE FROM event, magnitude, point WHERE evt_id = '$delete'"; 
mysql_query($query, $con); 
$query = "DELETE FROM trace WHERE pt_id = '$delete'"; 

か、単に.sqlファイルにその文を貼り付けて、それを実行してデータの一貫性を保つために1つのトランザクションでこれを行う、またはお使いのSQLソフトウェアのクエリウィンドウに、または.PHPでそれを配置する必要がありますファイルを作成し、サーバー上で実行します。

+1

私が知る限り、あなたはそのような複数のテーブルから削除することはできませんが、間違っている可能性があります。しかし、少なくとも 'trace'にはevt_idカラムがありません –

+0

データベースはサーバ上にあります。このクエリファイルを実行するにはどうすればよいですか? – user1202766

+0

はい、本当のトレースはevt_id列を持っていませんが、evt_id列を持つポイントテーブルからのpt_idを持っています。これは混乱しています! – user1202766

-1

異なるテーブルのIDが対応しており、リンクに使用されているとします。 私はまた、あなたがそれらは間接的にしか次のように、すべてのテーブルからあなたのレコードを削除することができます

をevt_idにリンクされているallthoughすべてのトレース・ポイントを削除すると仮定します。

DELETE event , magnitude, trace, point 
FROM event left join magnitude on event.evt_id = magnitude.evt_id 
    left join point on event.evt_id = point.evt_id 
     left join trace on point.pt_id = trace.trace_id 
where event_id=1139 
+5

これはmysqlでのみ動作し、OPはこの問題をmysqlとpostgresqlからpostgresql –

7

あなたの質問で唯一の非自明な要素は、テーブルtraceから削除されています。 trace.pt_idpoint.pt_idを参照していると想定するのは安全でしょうか?

foreign key with ON DELETE CASCADEを定義して、テーブルtrace(既にpointed out by @kevin)を忘れているか、手動で依存する行を処理する必要があります。

PostgreSQLの9.1ので、あなたはdata-modifying CTEsを使用することができます。

BEGIN; 

WITH x AS (
    DELETE FROM point WHERE evt_id = 1139 
    RETURNING pt_id 
    ) 
DELETE FROM trace 
USING x 
WHERE trace.pt_id = x.pt_id; 

DELETE FROM magnitude WHERE evt_id = 1139; 

DELETE FROM event WHERE evt_id = 1139; 

COMMIT; 

pt_id影響を受けDELETE FROM pointリターンのRETURNING clauseすべて - それらはtraceから対応するすべての行を削除するために使用順番です。

あなたの場合、並行性が問題かどうかは言及していません。存在する場合は、evt_id = 1139の行が既に別のテーブルから削除されている間に1つのテーブルに存在する削除の間に短時間のウィンドウで結果が表示されないようにするには、トランザクションにすべてをラップします。
問題がなければ、BEGINCOMMITを無視してください。

関連する問題