gpt4 book ai didi

sql - 根据表值找出哪个模式

转载 作者:行者123 更新时间:2023-11-29 11:32:22 25 4
gpt4 key购买 nike

我的数据库根据客户端分为模式(即:每个客户端都有自己的模式,具有相同的数据结构)。

我也碰巧有一个外部操作不知道它应该针对哪个模式。它来自系统的另一部分,它没有客户的概念,也不知道它在哪个客户的集合中运行。在我处理它之前,我必须找出请求需要针对哪个模式

要找到正确的模式,我必须找出哪个保存具有特定唯一 ID(字符串)的记录 R

据我了解,如下

SET search_path TO schema1,schema2,schema3,...

只会查看 schema1 中的表(或与表匹配的第一个模式),不会进行全局搜索。

有没有一种方法可以让我在所有模式中进行全局搜索,或者我是否只需要使用 for 循环并遍历所有模式,一次一个?

最佳答案

你可以使用 inheritance为了这。 (一定要考虑 limitations 。)

考虑这个小演示:

CREATE SCHEMA master;  -- no access of others ..

CREATE SEQUENCE master.myseq; -- global sequence for globally unique ids

CREATE table master.tbl (
id int primary key DEFAULT nextval('master.myseq')
, foo text);

CREATE SCHEMA x;
CREATE table x.tbl() INHERITS (master.tbl);
INSERT INTO x.tbl(foo) VALUES ('x');

CREATE SCHEMA y;
CREATE table y.tbl() INHERITS (master.tbl);
INSERT INTO y.tbl(foo) VALUES ('y');


SELECT * FROM x.tbl; -- returns 'x'
SELECT * FROM y.tbl; -- returns 'y'
SELECT * FROM master.tbl; -- returns 'x' and 'y' <-- !!

现在,要实际识别特定行所在的表,请使用 tableoid :

SELECT *, tableoid::regclass AS table_name
FROM master.tbl
WHERE id = 2;

结果:

id | foo | table_name
---+-----+-----------
2 | y | y.tbl

您可以从 tableoid 中获取源模式,最好是直接使用 tableoid 查询系统目录。 (显示名称取决于 search_path 的设置。)

SELECT n.nspname 
FROM master.tbl t
JOIN pg_class c ON c.oid = t.tableoid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE t.id = 2;

这也比遍历许多单独的表快

关于sql - 根据表值找出哪个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com