Postgres SQL命令,以确定哪些列可以是枚举,但不是枚举?

Postgres SQL命令,以确定哪些列可以是枚举,但不是枚举?,sql,database,postgresql,Sql,Database,Postgresql,上下文是,我正在构建一个通用工具,它可以接收不同的客户数据库,并将其与内部仪表板连接。所以在我的用例中,我经常遇到几十个varchar/int列,它们实际上只是枚举 我正在寻找一种方法,这样我就不必手动筛选每一列,看看它是否可以是枚举 是否有可以自动检测表中可枚举列的命令 SQL:从最多有10个不同值的位置进行选择 或者像上面那样的东西。有什么想法吗?您可以使用pg_统计系统目录对给定表中给定列的不同值进行估计: select schemaname, tablename, attname, n_

上下文是,我正在构建一个通用工具,它可以接收不同的客户数据库,并将其与内部仪表板连接。所以在我的用例中,我经常遇到几十个varchar/int列,它们实际上只是枚举

我正在寻找一种方法,这样我就不必手动筛选每一列,看看它是否可以是枚举

是否有可以自动检测表中可枚举列的命令

SQL:从最多有10个不同值的位置进行选择


或者像上面那样的东西。有什么想法吗?

您可以使用pg_统计系统目录对给定表中给定列的不同值进行估计:

select schemaname, tablename, attname, n_distinct
from pg_stats 
where n_distinct > 0 and n_distinct <= 10;
但这只是一个估计

请注意,对于n_distinct列:

如果大于零,则为 柱如果小于零,则为相异数的负数 值除以行数。否定形式在下列情况下使用: ANALYZE认为不同值的数量可能会减少 随着表的增长而增加;当列 似乎有固定数量的可能值。例如,-1 指示唯一列,其中不同值的数目为 与行数相同


我劝你不要那样做。只有当您不需要删除无法使用枚举删除的值时,枚举才是好的,要确定这是否可行,需要了解数据。任何自动程序都是错误的。使用查找表或检查约束以更灵活的方式限制可用条目。请放心,我很清楚我在做什么,这意味着什么,并得出结论,这在我的情况下是有意义的。我正在与大约80多个表(每个表有100多个列)进行争论,我只是在寻找一种方法来确保我有正确的数据类型。这是开发人员设置过程的一部分,显然我不会在prod中设置这样的内容。