3

一部の列にデフォルト値を指定したテーブルがあります。null値を列のデフォルト値に変更した後、テーブルにレコードを挿入する列に対応する引数を持つ関数を作成したいのですが、どの引数がnullであるかに基づいてプログラムでクエリを作成したくありません。本質的に私は次のようなものが欲しいです

INSERT into Table (c1, c2, c3, c4)
Values (coalesce(somevar, DEFAULT(c1)), ...)

これは可能ですか?私はmysqlがこれを行うことができるのを見てきました。postgresは同様のものを提供しますか?バージョン9.1を使用しています

更新:この質問はいくつかの興味深い解決策を提供しますが、残念ながら結果は常にテキストです。挿入に使用できるように、デフォルト値を実際のデータ型として取得したいと思います。デフォルト値をテキストからそのデータ型(テキストとして提供される)にキャストする解決策を見つけようとしましたが、方法が見つかりません:

SELECT column_name, column_default, data_type
FROM information_schema.columns
WHERE (table_schema, table_name) = ('public', 'mytable')
AND column_name = 'mycolumn'
ORDER BY ordinal_position;

上記はcolumn_defaultとdata_typeをテキストとして返すので、column_defaultをdata_typeのにキャストするにはどうすればよいですか?私がこれを行うことができれば、私の問題は解決されるでしょう。

4

2 に答える 2

1

テーブル定義がすべての列のデフォルト値で INSERT を受け入れる場合、以下の 2 段階の方法が機能する可能性があります。

CREATE FUNCTION insert_func(c1 typename, c2 typename, ...)
RETURNS VOID AS $$
DECLARE
 r record;
BEGIN
 INSERT into the_table default values  returning *,ctid INTO r;
 UPDATE the_table set
  col1=coalesce(c1,r.col1),
  col2=coalesce(c2,r.col2),
  ...
 WHERE the_table.ctid=r.ctid;
END;
$$ language plpgsql;

秘訣は、r挿入中にすべてのデフォルト値をレコード変数に取得し、その後 UPDATE でそれらを使用してデフォルト以外の値を置き換えることです。ctid挿入されたばかりの行の内部固有 ID を指定する疑似列です。

警告: 最初の INSERT が失敗するため、一部の列にデフォルトの null 値と非 null チェック (またはデフォルト値が受け入れられないことを意味するチェック) がある場合、このメソッドは機能しません。

于 2013-01-08T23:38:40.183 に答える