我看到至少三种好方法 - 取决于您的问题中缺少的更多细节。我以你的例子为基础:
试验台:
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 上的唯一键或主键。但在这样的场景中,您可能会遇到这种情况。
如果t2.id 中的值不是唯一的,或者t1.id 中的值违反了外键约束,则可以改为在删除后创建触发器。
触发功能:
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;