Как я могу узнать, какие столбцы в базе данных Postgres НЕ могут быть обнуляемыми? - PullRequest
0 голосов
/ 20 сентября 2019

У нас есть некоторый устаревший код + данные, которые были немного ленивыми, когда дело доходит до установки NOT NULL ограничений на столбцы (то же самое для кода, который генерирует данные).

Не всегда известно, являются ли эти столбцыдолжен быть обнуляемым или нет (иногда функции были написаны несколько лет назад).

Было бы здорово взглянуть на наши реальные данные, чтобы увидеть, являются ли какие-либо из этих столбцов NULLABLE, но в них нет значений NULL. Мы могли быРассмотрим некоторые из них как кандидатов для добавления ненулевых ограничений.

(Очевидно, что отсутствие нулей не означает, что это не обязательно означает, что они должны быть не обнуляемыми: возможно, нам просто не повезло, но это хорошее место для начала)

1 Ответ

0 голосов
/ 20 сентября 2019

Вот что я придумал:

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, так как каждый столбец будет полностью отсканирован в таблице), так что будьте осторожны!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...