2016-06-21 10 views
0

レコードを取得するテーブルのtable OIDを格納するカラムを持つテーブルがあります。このフィールドに値を入力する必要がある場合(NOT NULL)、指定しない場合はデフォルト値を使用できます。挿入する際に現在のtable OIDを保存したいと思います。テーブルに挿入するときに現在のテーブルのOID(regclass)を取得

CREATE TABLE t AS(
    Source regclass NOT NULL DEFAULT current_table_name()::regclass 
); 

このタスクを実行するには、PostgreSQLのテーブル内の任意の関数(current_table_name)はありますか?

答えて

1

にはそのような機能はありませんが、次の3つのステップで目標を達成することができます

  1. DEFAULTせずにテーブルを作成します。
  2. 新しいテーブルのOIDを検索します。
  3. ALTERテーブルを設定してDEFAULTを設定します。

regclassにテーブル名をキャストするよりも、テーブルの名前が変更された後、後者INSERT秒で突然失敗を開始しますので、テーブルのOIDを使用することをお勧めします。ここで

はそれを達成するDOブロックです:

DO $$DECLARE 
    reloid oid; 
BEGIN 
    CREATE TABLE t (source regclass NOT NULL); 
    SELECT t.oid INTO reloid 
     FROM pg_class t 
      JOIN pg_namespace n ON t.relnamespace = n.oid 
     WHERE t.relname = 't' AND n.nspname = current_schema; 
    EXECUTE 'ALTER TABLE t ALTER source SET DEFAULT ' || reloid; 
END;$$; 
関連する問題