【问题标题】:How can I find out which columns in a Postgres database could be NOT nullable?如何找出 Postgres 数据库中的哪些列不能为空?
【发布时间】:2020-01-21 13:54:28
【问题描述】:

我们有一些遗留代码+数据,在设置NOT NULL 列限制时有点懒惰(生成数据的代码也是如此)。

并不总是知道这些列是否可以为空(有时功能是几年前编写的)。

最好查看我们的真实数据,看看这些列中是否有任何列是 NULLABLE 但恰好没有 NULL 值。我们可能会考虑将其中一些列作为添加非空限制的候选。

(显然,没有空值并不意味着这并不一定意味着它们不应该为空:我们可能只是运气不好,但这是一个很好的起点)

【问题讨论】:

    标签: database postgresql null data-cleaning


    【解决方案1】:

    这是我想出的:

    CREATE OR REPLACE FUNCTION any_is_null(col TEXT, tab TEXT, OUT tmp BOOL) RETURNS boolean  
    AS $$  
      BEGIN  
        EXECUTE format('SELECT 
                       true 
                       from %s 
                       WHERE %s IS NULL LIMIT 1
                       ', tab, col) into tmp;
      END; 
    $$ LANGUAGE plpgsql;  
    
    select c.table_schema,
           c.table_name,
           c.column_name,
           case c.is_nullable
                when 'NO' then 'false'
                when 'YES' then 'true'
           end as nullable,
           CASE 
             WHEN any_is_null(c.column_name, c.table_name) IS NULL 
                AND c.is_nullable = 'YES' 
             THEN true 
             ELSE FALSE 
           END as could_be_non_nullable
    
    from information_schema.columns c
    join information_schema.tables t
         on c.table_schema = t.table_schema 
         and c.table_name = t.table_name
    where c.table_schema in ('public')
          and t.table_type = 'BASE TABLE' 
    order by table_schema,
             table_name,
             column_name;
    

    where c.table_schema in ('public') 替换为您要关注的架构。

    完成后不要忘记删除函数。

    PS:如果您有很多没有 NULL 值的列,这可能会使您的数据库最大化,因为每列都会被全表扫描)所以要小心!

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2015-06-18
      • 2011-08-20
      • 2011-11-08
      相关资源
      最近更新 更多