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

psqlで外部キー制約を使用して、あるテーブルの構造を別のテーブルにコピーするにはどうすればよいですか?

    CREATE TABLE ... LIKE ...に外部キーを自動的に作成するオプションはありません。 。

    ドキュメントの場合:

    実際には、GUIツールを使用すると簡単です。たとえば、PgAdmin IIIの場合:

    • source_tableのコピー宣言(DDL) クエリツール(ctrl-e)へ
    • 宣言を編集します
    • SQLを実行します。

    SQLスクリプトでは、次の関数を使用できます。重要な前提:ソーステーブルの外部キーには正しい名前があります。つまり、それらの名前にはソーステーブル名が含まれています(一般的な状況です)。

    create or replace function create_table_like(source_table text, new_table text)
    returns void language plpgsql
    as $$
    declare
        rec record;
    begin
        execute format(
            'create table %s (like %s including all)',
            new_table, source_table);
        for rec in
            select oid, conname
            from pg_constraint
            where contype = 'f' 
            and conrelid = source_table::regclass
        loop
            execute format(
                'alter table %s add constraint %s %s',
                new_table,
                replace(rec.conname, source_table, new_table),
                pg_get_constraintdef(rec.oid));
        end loop;
    end $$;
    

    使用例:

    create table base_table (base_id int primary key);
    create table source_table (id int primary key, base_id int references base_table);
    
    select create_table_like('source_table', 'new_table');
    
    \d new_table
    
       Table "public.new_table"
     Column  |  Type   | Modifiers 
    ---------+---------+-----------
     id      | integer | not null
     base_id | integer | 
    Indexes:
        "new_table_pkey" PRIMARY KEY, btree (id)
    Foreign-key constraints:
        "new_table_base_id_fkey" FOREIGN KEY (base_id) REFERENCES base_table(base_id)
    


    1. OracleBIPublisherで数値を単語に変換する

    2. JDBCを使用したPostgreSQLへの低速挿入

    3. Wildfly10が起動時にMySQLXAドライバーをロードできない

    4. ソートを使用した再帰的サブクエリ