Postgres复合外键是否支持ON DELETE CASCADE?DROP行为疑问
PostgreSQL复合外键与ON DELETE CASCADE支持说明
核心结论
PostgreSQL完全支持复合外键搭配ON DELETE CASCADE,你给出的表结构定义是合法且有效的。
关于DROP TABLE T1 CASCADE的行为解释
你遇到的DROP TABLE T1 CASCADE仅删除T1表和T2的外键约束,是因为这个命令的作用是删除整个表对象,而非删除表中的行:
DROP TABLE ... CASCADE的逻辑是:删除目标表的同时,自动清理所有依赖该表的数据库对象(比如外键约束、视图等),它和ON DELETE CASCADE的触发逻辑完全无关。ON DELETE CASCADE是针对行级删除操作的约束:当你执行DELETE FROM T1 WHERE id = 'xxx' AND order_time = 'yyy';这类删除T1中特定行的命令时,PostgreSQL会自动删除T2中所有匹配t1_id = 'xxx' AND t1_order_time = 'yyy'的记录,这才是该约束的生效场景。
验证方法
若要验证复合外键的ON DELETE CASCADE效果,可执行以下步骤:
- 向T1插入测试数据:
INSERT INTO T1(id, order_time) VALUES ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', '2024-01-01 00:00:00+08');
- 向T2插入关联数据:
INSERT INTO T2(id, t1_id, t1_order_time) VALUES ('b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', '2024-01-01 00:00:00+08');
- 删除T1中的测试行:
DELETE FROM T1 WHERE id = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' AND order_time = '2024-01-01 00:00:00+08';
- 查询T2,会发现关联的记录已被自动删除。
内容的提问来源于stack exchange,提问作者ashish
相关产品推荐
相关产品推荐

