sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLにテーブルが存在するかどうかを確認する5つの方法

    以下は、テーブルがPostgreSQLデータベースに存在するかどうかを確認する5つの方法です。

    pg_tables 表示

    pg_tables ビューには、データベース内の各テーブルに関する情報が含まれています。

    これを使用して、特定のテーブルが現在のデータベースに存在するかどうかを確認できます。

    SELECT EXISTS (
        SELECT FROM 
            pg_tables
        WHERE 
            schemaname = 'public' AND 
            tablename  = 'actor'
        );

    結果:

    True

    この場合、Trueを取得します 、これはテーブルが存在することを意味します(そして私はそれにアクセスできます)。

    構成によっては、tを取得する場合があります / f Trueの代わりに /False

    information_schema.tables 表示

    information_schema.tables ビューには、現在のユーザーがアクセスできる現在のデータベースで定義されているすべてのテーブルとビューが含まれます。

    これを使用して、特定のテーブルが存在するかどうか、およびそのテーブルにアクセスできるかどうかを確認できます。

    SELECT EXISTS (
        SELECT FROM 
            information_schema.tables 
        WHERE 
            table_schema LIKE 'public' AND 
            table_type LIKE 'BASE TABLE' AND
            table_name = 'actor'
        );

    結果:

    True

    それを行う別の方法は、カウントを取得することです:

    SELECT 
        COUNT(table_name)
    FROM 
        information_schema.tables 
    WHERE 
        table_schema LIKE 'public' AND 
        table_type LIKE 'BASE TABLE' AND
    	table_name = 'actor';

    結果:

    1

    table_type 次のいずれかになります:

    BASE TABLE 永続ベーステーブル(通常のテーブル)
    VIEW 表示
    FOREIGN 外部テーブル
    LOCAL TEMPORARY 一時テーブル

    table_typeは省略できます 名前がすべてのタイプに存在するかどうかを確認する場合は、フィルターから。

    システムカタログ

    システムカタログは、RDBMSがテーブルや列に関する情報、内部の簿記情報などのスキーマメタデータを格納する場所です。

    Postgresでは、システムカタログは通常のテーブルです。

    それらのうちの2つを使用して、特定のテーブルが存在するかどうかを確認できます。

    SELECT EXISTS (
        SELECT FROM 
            pg_catalog.pg_class c
        JOIN 
            pg_catalog.pg_namespace n ON 
            n.oid = c.relnamespace
        WHERE  
            n.nspname = 'public' AND 
            c.relname = 'actor' AND 
            c.relkind = 'r'
        );

    結果:

    True

    relkind r通常のテーブル用です 。

    relkindを削除できます テーブルに付けたい名前がオブジェクトにすでにあるかどうかを確認したいだけの場合は、完全にフィルタリングします。

    または、他のタイプでフィルタリングすることもできます。

    オプションは次のとおりです。

    r 通常のテーブル
    i インデックス
    S シーケンス
    t TOASTテーブル
    v 表示
    m マテリアライズドビュー
    c 複合タイプ
    f 外部テーブル
    p パーティションテーブル
    I パーティション化されたインデックス

    to_regclass() 機能

    to_regclass() 関数は、テキスト関係名をそのOIDに変換します。名前が存在する場合は、OIDが返されます。

    例:

    SELECT to_regclass('public.actor');

    結果:

    actor

    テーブルが存在しない場合は、NULLが返されます。

    regclassにキャストします

    テーブル名をキャストしてregclassと入力することもできます :

    SELECT 'public.actor'::regclass

    結果:

    actor

    ただし、テーブルが存在しない場合はエラーが発生します。

    テーブルを作成する前に、テーブルがすでに存在するかどうかを確認してください

    テーブルが存在しない場合にテーブルを作成する必要がある場合は、IF NOT EXISTSを使用できます。 CREATE TABLEの句 声明。テーブルが存在しない場合は作成されます。すでに存在する場合、作成されません。

    例については、PostgreSQLに存在しない場合にのみテーブルを作成するを参照してください。


    1. make_timestamptz()がPostgreSQLでどのように機能するか

    2. 1052:フィールドリストの列'id'があいまいです

    3. マクロとは何ですか?どのように使用しますか?

    4. SQLのネストされたウィンドウ関数