Postgres 8.4及更高版本的数据库在public架构中包含公用表,在架构中包含公司特定的表company。
company模式名称始终’company’以公司编号开头和结尾。
因此,可能会有类似以下的模式:
public
company1
company2
company3
...
companynn
应用程序始终与单个公司一起使用。
的search_path相应指定在ODBC或连接Npgsql的字符串,如:
search_path='company3,public'
您如何检查指定表中是否存在给定表companyn?
例如:
select isSpecific('company3','tablenotincompany3schema')
应该返回false,并且
select isSpecific('company3','tableincompany3schema')
应该回来true。
无论如何,该函数应仅检查companyn传递的架构,而不检查其他架构。
如果给定表public和传递的模式中均存在给定表,则该函数应返回true。
它应该适用于Postgres 8.4或更高版本。
这取决于您要精确测试的内容。
信息模式?
要查找“表是否存在”(无论是谁问的),严格来说,查询信息模式(information_schema.tables)是不正确的,因为(根据文档):
仅显示当前用户有权访问的那些表和视图(通过成为所有者或具有某些特权的方式)。
@kong提供的查询可以返回FALSE,但是表仍然存在。它回答了这个问题:
如何检查表(或视图)是否存在,当前用户是否有权访问它?
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
);
信息模式主要用于在主要版本和不同RDBMS之间保持可移植性。但是实现速度很慢,因为Postgres必须使用复杂的视图来遵守该标准(这information_schema.tables是一个非常简单的示例)。而且某些信息(例如OID)在翻译时会从系统目录中丢失-实际上,这些目录携带着所有信息。
系统目录
您的问题是:
如何检查表是否存在?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
AND c.relkind = 'r' -- only tables
);
使用系统目录pg_class和pg_namespace直接,这也是相当快。但是,根据以下文档pg_class:
目录pg_class目录表和其他大多数所有有字段或者是那些类似表的东西。这包括索引(但也参见pg_index),序列,视图,物化视图,复合类型和TOAST表;
对于此特定问题,您还可以使用系统视图pg_tables。在主要的Postgres版本中更简单和更易于移植(此基本查询几乎无需关注):
SELECT EXISTS (
SELECT FROM pg_tables
WHERE schemaname = 'schema_name'
AND tablename = 'table_name'
);
标识符在上述所有对象中必须唯一。如果您想问:
如何检查给定架构中的表或类似对象的名称?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
);
在dba.SE上讨论“信息模式与系统目录”的相关答案
替代方法:强制转换为 regclassSELECT 'schema_name.table_name'::regclass
这引发一个例外,如果(任选模式修饰)表(或其它物体占据该名称)不存在。
如果您不对表名进行模式限定,则强制转换regclass为,search_path并返回找到的第一个表的OID-如果该表不在所列模式中,则返回异常。请注意,系统架构pg_catalog和和pg_temp(当前会话的临时对象的架构)自动成为的一部分search_path。
您可以使用它并在函数中捕获可能的异常。例子:
检查Postgres(plpgsql)中是否存在序列
上面的查询避免了可能的异常,因此速度稍快。
to_regclass(rel_name) 在Postgres 9.4+
现在简单得多:
SELECT to_regclass('schema_name.table_name');
与演员表相同,但返回…
… null而不是如果找不到名称则抛出错误
Postgres 8.4和更高版本的数据库在架构中包含公共表,在架构中包含公司特定表。 架构名称始终以开头,以公司编号结尾。 因此可能存在如下架构: 应用程序总是与单个公司一起工作。 相应地在odbc或npgsql连接字符串中指定,如: 如果给定的表同时存在于和传递的模式中,则该函数应返回。 它应适用于Postgres8.4或更高版本。
问题内容: 我想在更新密钥值之前测试字典中是否存在密钥。我写了以下代码: 我认为这不是完成此任务的最佳方法。有没有更好的方法来测试字典中的键? 问题答案: 是测试密钥是否存在的预期方法。 如果你想使用默认值,可以随时使用dict.get(): 如果你想始终确保任何键的默认值,则可以重复使用,也可以从模块中使用它,如下所示: 但总的来说,关键字是最好的方法。
问题内容: 给定Linux进程的pid,我想从C程序检查该进程是否仍在运行。 问题答案: 发出信号作为系统调用。如果调用成功,则表示存在具有此pid的进程。 如果调用失败并设置为,则不存在具有此类pid的进程。 引用POSIX标准: 如果sig为0(空信号),则执行错误检查,但实际上未发送任何信号。空信号可用于检查pid的有效性。 请注意,您在竞争条件下并不安全:目标进程可能已退出,并且与此同时已
问题内容: 我正在通过.NET应用程序中的ODBC驱动程序连接到Hive。是否存在查询以确定表是否已存在? 例如,在MSSQL中,您可以查询表,而在Netezza中,您可以查询表。 任何援助将不胜感激。 问题答案: 您可以通过两种方法进行检查: 1.)如@dimamah所建议,只需在此处添加一点,对于这种方法,您需要 2.)第二种方法是使用HiveMetastoreClient API,您可以在其
问题内容: 有没有办法检查pid是否对应于有效进程?我从其他来源获得pid ,我需要检查计算机上是否不存在具有该pid的进程。 我需要它在Unix和Windows中可用。我也在检查PID是否未使用。 问题答案: 如果pid没有运行,则向pid发送信号0将引发OSError异常,否则不执行任何操作。
我是boto3的新用户,我正在使用DynamoDB。 我浏览了dynamodbapi,没有找到任何方法告诉我是否已经存在一个表。 处理这个问题的最佳方法是什么? 我应该尝试创建一个新表并使用try-catch包装它吗?