2016-06-28 4 views
1

これは私が必要とする簡単な例です。任意のテーブルに対して、私は主キーのすべてのインスタンスを取得する必要があります。これは少しの例ですが、それを行う方法。テーブルの主キーのすべてのインスタンスを取得

create table foo 
(
a numeric 
,b text 
,c numeric 
constraint pk_foo primary key (a,b) 
) 

insert into foo(a,b,c) values (1,'a',1),(2,'b',2),(3,'c',3); 

私は主キーのインスタンスがユーザーによって変更された場合に制御する必要があるが、私はしたくない<魔法の事>

結果

 a|b 
    1 |1|a| 
    2 |2|b| 
    3 |3|c| 
    .. ... 

を選択あまりにも多くのテーブルでコードを繰り返す!私は、更新と何とか何とか何とか前に、トリガーの上に置くために機能して<不思議な事> を置く、それを行うための一般的な方法を必要とする...

+0

大丈夫Javaのですか、あなたを行いますそれはまっすぐなSQLとしたいですか?ユニークキー、候補キーなどを意味しますか? –

+0

(幸いにも)あなたはそれだけでSQLを行うことはできません。 – zerkms

+0

@BradleyRossええ、SQLのみと私は唯一の任意のテーブルの主キーのインスタンスを知りたい –

答えて

1

PostgreSQLではあなたは常に結果を提供しなければなりませんクエリのタイプ。しかし、あなたが必要とするクエリのコードを取得し、クライアントからのクエリを実行することができます

create or replace function get_key_only_sql(regclass) returns string as $$ 
select 'select '|| (
      select string_agg(quote_ident(att.attname), ', ' order by col) 
      from pg_index i 
      join lateral unnest(indkey) col on (true) 
      join pg_attribute att on (att.attrelid = i.indrelid and att.attnum = col) 
      where i.indrelid = $1 and i.indisprimary 
      group by i.indexrelid 
      limit 1) || ' from '||$1::text 
end; 
$$ language sql; 

ここでは上記の機能を使用して、いくつかのクライアントの擬似コードです:

sql = pgexecscalar("select get_key_only_sql('mytable'::regclass)"); 
rs = pgopen(sql); 
+0

ええ、この作品!私の問題は、指定されたテーブルの主キーの列名を取得する方法を知りませんでしたが、あなたはそれを解読します!ありがとうございました –

+0

情報ありがとうございます。私は過去にSQLでそれをやっていましたが、PostgresではJDBCを使いました。 –

関連する問題