私は2つのテーブルt1
とt2
. t2
この方法で特定の行を削除しています:
delete from t2 where expiry < NOW();
と の両方にid
共通の列があります。上記のステートメントが実行されると、対応する行があれば削除したいと思います (存在しない可能性があります)。t1
t2
t1
これはどのように行うことができますか?
これらの両方の操作に対して単一のクエリを作成することは可能ですか?
私は2つのテーブルt1
とt2
. t2
この方法で特定の行を削除しています:
delete from t2 where expiry < NOW();
と の両方にid
共通の列があります。上記のステートメントが実行されると、対応する行があれば削除したいと思います (存在しない可能性があります)。t1
t2
t1
これはどのように行うことができますか?
これらの両方の操作に対して単一のクエリを作成することは可能ですか?
あなたの質問に欠けている詳細に応じて、少なくとも3つの良い方法があります。私はあなたの例に基づいています:
t2
マザーテーブルですt1
子供ON CASCADE DELETE
テスト ベッド:
CREATE TABLE t2 (
id serial PRIMARY KEY -- primary or unique key needed
, expiry timestamp
);
CREATE TABLE t1 (
id int references t1(id) ON DELETE CASCADE -- ON UPDATE CASCADE, too?
);
テーブルにデータを入力します。
INSERT INTO t2(expiry)
SELECT (now() + g * interval '1h')
FROM generate_series(1, 10) g; -- 10 arbitrary rows
INSERT INTO t1(id)
SELECT id FROM t2 WHERE id%2 = 0; -- pick even numbers for t1
SELECT * FROM t1;
t2 から行を削除すると、対応する t1 の行が自動的に削除されます。
DELETE FROM t2 WHERE id IN (1,2,3,4,5);
-- rows 2,4 in `t1` are deleted automatically
このような外部キー制約を既存のテーブルに追加するには:
ALTER TABLE t1 ADD CONSTRAINT t1_id_fkey FOREIGN KEY (id)
REFERENCES t2 (id) ON DELETE CASCADE;
もちろん、外部キーには一意のキーまたは主キーが必要t1.id
です。しかし、あなたはおそらくそのようなシナリオでそれを持っています.
AFTER DELETE
の値t2.id
が一意でない場合、またはt1.id
外部キー制約に違反する値がある場合は、代わりに AFTER DELETE トリガーを作成できます。
トリガー機能:
CREATE OR REPLACE FUNCTION t2_delaft
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
DELETE FROM t1
WHERE t1.id = OLD.id;
RETURN NULL; -- AFTER trigger can return NULL
END
$func$
引き金:
CREATE TRIGGER delaft
AFTER DELETE ON t2
FOR EACH ROW EXECUTE PROCEDURE t2_delaft();
RULEを実装することもできます。しかし、トリガーは一般的に扱いやすいと思います。
最後に最も簡単な答えを与えてしまったことを許してください。PostgreSQL 9.1以降を使用している場合、これは何に関係なく機能します:
WITH x AS (
DELETE FROM t1
WHERE id IN (1,2,3,4,5)
RETURNING id
)
DELETE FROM t2
USING x
WHERE t2.id = x.id;