前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >EDB无法删除分区子表的错误

EDB无法删除分区子表的错误

作者头像
bisal
发布2019-02-28 16:17:42
发布2019-02-28 16:17:42
1.7K0
举报

这是杂货铺的第432篇文章

EDB相关文章,

《EDB(/PG)对于执行计划的解读》

《EDB是什么数据库?》

《EDB日期类型的一个问题》

最近某个应用,连接的是EDB数据库,测试环境是EDB 9.2版本,在删除一张inherit方式创建的分区子表(例如主表a,子表b),先用alter table b no herit a删除关联,再drop删除子表,提示无法删除,从错误提示看,主表a要依赖子表b,建议删除主表a,达到删除子表b的效果。可我都删除了主子关系,为什么无法删表?

ERROR:  cannot drop table b because table a requires it HINT:  You can drop table a instead.

我们通过实验,重新模拟下这个过程。

1. 创建主表t_a。

2. 以inherits+check的方式,创建子表t_b。

3. 使用no inherit删除主子表关联关系。

4. 执行drop,可以正常删除,并未出现报错。

P.S. 其实即使不用no inherit,可以直接删除这张子表。

为什么这次没有报错?究竟主表有什么依赖于子表的?

一开始,我是怀疑有什么外键之类的属性,没有删除,导致主表依赖于子表,或者no inherit没有真正删除关联,但是这些猜测,都一一验证不对。

通过询问建表的操作,才发现个细节。EDB下创建分区,可以有两种方法,一种是传统的partition by range,一种是用inherit。而上述出现问题的场景下,主表a使用partition by range创建,新增的分区,则使用了inherit创建,效果如何,我们通过实验,模拟一下。

1. 使用partition by range创建主表a。

2. 以inherit创建子表b。

3. 删除子表b,此时提示主表a依赖于子表b。

4. 使用no inherit删除关联,删除子表b,还是提示主表a依赖于子表b。

5. 只有删除主表a,才能删除子表b。

因此,针对这个报错,就是因为用的partition by range创建的主表,子表使用inherit创建,此时删除子表,就不会成功了。不知道这种设计,是为了什么?

但是,在EDB 9.3和EDB 10版本上,使用partition by range创建主表,此时是禁止用inherit,创建子表的,这种操作,会提示,压根不给你inherit删除partition by range子表的机会,

不确定这个问题,是EDB 9.2的bug,还是EDB 9.3和10在设计上的升级,根本思路,还是分区表创建的一致性,要么使用partition by range,要么使用inherit,不会交叉使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年02月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档