获取表的所有主键实例

时间:2016-06-28 02:31:27

标签: postgresql key instances

这是我需要的一个简单示例,对于任何给定的表,我需要获取主键的所有实例,这是一个小例子,但我需要一种通用的方法来实现它。

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|
   ..   ...

我需要控制用户是否更改了主键的实例,但我不想在太多表中重复代码!我需要一种通用的方法,我会把<神奇的东西>  在更新之前把它放在触发器上的函数中,等等等等等等......

1 个答案:

答案 0 :(得分: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);