如何检查我所有表的存在?在postgresql中

时间:2016-06-01 10:17:30

标签: sql postgresql postgresql-9.2

我想检查所有表的存在。如果所有表都存在则发送1,如果缺少一个或多个表,则发送0。

select 1 from information_schema.tables tbl where tbl.table_name='graphe';
select 1 from information_schema.tables tbl where tbl.table_name='proprieteindicateur';
select 1 from information_schema.tables tbl where tbl.table_name='graphe_proprieteindicateur';
select 1 from information_schema.tables tbl where tbl.table_name='utilisateurs';
select 1 from information_schema.tables tbl where tbl.table_name='profil';
select 1 from information_schema.tables tbl where tbl.table_name='droit'; 

3 个答案:

答案 0 :(得分:1)

这可以通过一个声明来完成:

with table_list (name) as (
  values 
   ('graphe'),
   ('proprieteindicateur'),
   ('graphe_proprieteindicateur'),
   ('utilisateurs'),
   ('profil'),
   ('droit')
)
select count(*) = (select count(*) from table_list)
from information_schema.tables it
  join table_list l on it.table_name = l.name
and it.table_schema = 'public';

如果找到所有表格,它将返回true,如果没有,则返回false

答案 1 :(得分:0)

您可以创建一个根据条件返回0或1的函数。例如(我无法访问Postgres数据库来检查语法!):

CREATE OR REPLACE FUNCTION checkTables()
RETURNS smallint AS
$BODY$
DECLARE
cnt   smallint;
rntVal smallint;
begin
  SELECT count(1) 
  INTO cnt 
  FROM information_schema.tables tbl 
  where tbl.table_name IN ('graphe', 
                           'proprieteindicateur',
                           'graphe_proprieteindicateur', 
                           'utilisateurs', 
                           'profil',
                           'droit');

  if(cnt == 6)then
    rtnVal = 1
  else
    rtnVal = 0
  end if;
end;
return rtnVal;
$BODY$
LANGUAGE plpgsql VOLATILE

答案 2 :(得分:0)

我找到了另一种效果很好的解决方案,但它在shell中。

PRESENCE_TABLE=$OK
for table in $LISTE_TABLE
do
    TABLE_EXISTE=$(psql -t -w -f $FILE_SQL_VERIF_MDD --set nom=\'$table\' | tr -d " ")
    if [ -z $TABLE_EXISTE ]
    then
        echo_log -e "La table $table n''existe pas en base."
        PRESENCE_TABLE=$KO
    fi
done


if [ $PRESENCE_TABLE -ne $OK ]
then
    echo_log -e "Il manque de(s) table(s) dans le modele de donnees, il faut relancer le script avec l'option ...."
    fct_exit $KO
fi

希望有所帮助