You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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效果,可执行以下步骤:

  1. 向T1插入测试数据:
INSERT INTO T1(id, order_time) VALUES ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', '2024-01-01 00:00:00+08');
  1. 向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');
  1. 删除T1中的测试行:
DELETE FROM T1 WHERE id = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' AND order_time = '2024-01-01 00:00:00+08';
  1. 查询T2,会发现关联的记录已被自动删除。

内容的提问来源于stack exchange,提问作者ashish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:52:20