【问题标题】: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 值的列,这可能会使您的数据库最大化,因为每列都会被全表扫描)所以要小心!