获取 table 的主键的所有实例
Get all instances of primary keys of a table
这是我需要的一个简单示例,对于任何给定的 table,我需要获取主键的所有实例,这是一个小示例,但我需要一种通用的方法它。
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);
select <神奇的东西>
结果
a|b
1 |1|a|
2 |2|b|
3 |3|c|
.. ...
我需要控制主键的实例是否被用户更改,但我不想在太多 table 中重复代码!我需要一个通用的方法来做到这一点,我会把 <神奇的东西>
在一个函数中,在更新之前把它放在触发器上等等等等......
在 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 = and i.indisprimary
group by i.indexrelid
limit 1) || ' from '||::text
end;
$$ language sql;
下面是一些使用上述函数的客户端伪代码:
sql = pgexecscalar("select get_key_only_sql('mytable'::regclass)");
rs = pgopen(sql);
这是我需要的一个简单示例,对于任何给定的 table,我需要获取主键的所有实例,这是一个小示例,但我需要一种通用的方法它。
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);
select <神奇的东西>
结果
a|b
1 |1|a|
2 |2|b|
3 |3|c|
.. ...
我需要控制主键的实例是否被用户更改,但我不想在太多 table 中重复代码!我需要一个通用的方法来做到这一点,我会把 <神奇的东西> 在一个函数中,在更新之前把它放在触发器上等等等等......
在 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 = and i.indisprimary
group by i.indexrelid
limit 1) || ' from '||::text
end;
$$ language sql;
下面是一些使用上述函数的客户端伪代码:
sql = pgexecscalar("select get_key_only_sql('mytable'::regclass)");
rs = pgopen(sql);