は、私はこれらのテーブルを持っている:複数のテーブルからデータを削除するにはどうすればよいですか?
event (evt_id, evt_code, reg_id) magnitude (mag_id, evt_id, value) trace (trace_id, pt_id) point (pt_id, evt_id)
は私がevt_id=1139
に関連するすべてのテーブルからすべての行を削除したいです。
どうすればよいですか?
は、私はこれらのテーブルを持っている:複数のテーブルからデータを削除するにはどうすればよいですか?
event (evt_id, evt_code, reg_id) magnitude (mag_id, evt_id, value) trace (trace_id, pt_id) point (pt_id, evt_id)
は私がevt_id=1139
に関連するすべてのテーブルからすべての行を削除したいです。
どうすればよいですか?
スキーマを制御できる場合は、スキーマに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;
$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でそれを配置する必要がありますファイルを作成し、サーバー上で実行します。
異なるテーブルの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
これはmysqlでのみ動作し、OPはこの問題をmysqlとpostgresqlからpostgresql –
行は、あなたが缶を削除する場合ON DELETE CASCADE句との関係にFOREIGN KEY制約を定義することができます。一番上の行を削除すると、その行がカスケードして削除されます。
http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK
あなたの質問で唯一の非自明な要素は、テーブルtrace
から削除されています。 trace.pt_id
がpoint.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つのテーブルに存在する削除の間に短時間のウィンドウで結果が表示されないようにするには、トランザクションにすべてをラップします。
問題がなければ、BEGIN
とCOMMIT
を無視してください。
私が知る限り、あなたはそのような複数のテーブルから削除することはできませんが、間違っている可能性があります。しかし、少なくとも 'trace'にはevt_idカラムがありません –
データベースはサーバ上にあります。このクエリファイルを実行するにはどうすればよいですか? – user1202766
はい、本当のトレースはevt_id列を持っていませんが、evt_id列を持つポイントテーブルからのpt_idを持っています。これは混乱しています! – user1202766