暂无图片
请指教,PG12遇到报错 ERROR: could not find tuple for attrdef 37(Drop sequence seq1报错)
我来答
分享
jack325
2024-01-05
请指教,PG12遇到报错 ERROR: could not find tuple for attrdef 37(Drop sequence seq1报错)

PG12遇到报错 ERROR: could not find tuple for attrdef 37(Drop sequence  seq1报错)

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
jack325

我查了一些资料,

 delete from pg_class where oid=1233 --sequence 的oid;   

delete from pg_depend  where objid=1233  ;

这种清理的方案安全吗? 有谁有涉及这种原理的文章,请帮忙解答一下;

暂无图片 评论
暂无图片 有用 4
yBmZlQzJ

删除 pg_class 或 pg_depend 中直接与序列对象关联的记录是一种非常危险的操作,因为它违反了 PostgreSQL 对系统表的一致性维护原则。在正常情况下,数据库管理系统(如 PostgreSQL)提供了专门的 SQL 语句来管理数据库对象,例如创建、修改和删除序列应当使用 CREATE SEQUENCEALTER SEQUENCE 和 DROP SEQUENCE

直接删除 pg_class 或 pg_depend 系统表中的记录可能会导致以下问题:

  1. 数据不一致:删除这些系统表中的记录没有通过正常的事务处理或内部一致性检查,可能导致其他依赖于该序列的对象无法正确工作,比如触发器、约束或者其他引用该序列的表。

  2. 恢复问题:PostgreSQL 的垃圾回收机制不会清理那些未通过正规途径删除的对象,这可能导致空间泄露或者后续清理操作出现问题。

  3. 安全性:由于系统表是数据库的核心组成部分,直接修改它们可能引发未知的副作用,甚至可能破坏整个数据库的完整性。

  4. 权限问题:通常用户不应拥有对系统表进行直接修改的权限,即使是超级用户也应当尽量避免非标准操作,除非在极特殊且清楚后果的情况下。

暂无图片 评论
暂无图片 有用 1
jack325
题主
2024-01-06
我也不想操作啊,关键如题,遇到这样的问题,有什么建议呢 ??
zzzdwd

你需要先确认你想要删除的序列是否正被某个表使用。如果确实存在这样的使用,你需要先更新表的结构,将默认的序列值更改为NULL或者其他不依赖现有序列的值,然后再尝试删除序列。这可以通过ALTER TABLE语句配合ALTER COLUMN子句来实现。

暂无图片 评论
暂无图片 有用 0
舒悦

先备份后操作,每个操作都存在风险只有小心谨慎。

暂无图片 评论
暂无图片 有用 0
subverter

建议先在测试环境测试一下上述操作,在生产环境先备份后操作。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏