我知道如果常规视图所依赖的表被删除,则常规视图将无效。
这同样适用于物化视图吗?
我假设在物化视图中,由于数据已与源表分离,因此应该可以删除该表,但如果尝试重新创建或刷新视图,则会发出警告或中止。
简而言之,只要不尝试重新创建物化视图,就可以将其与其源表解耦吗?
我知道如果常规视图所依赖的表被删除,则常规视图将无效。
这同样适用于物化视图吗?
我假设在物化视图中,由于数据已与源表分离,因此应该可以删除该表,但如果尝试重新创建或刷新视图,则会发出警告或中止。
简而言之,只要不尝试重新创建物化视图,就可以将其与其源表解耦吗?
我想创建一个视图,对多个模式共有的表进行求和,如此处所示,并包含模式名称或派生表达式作为列,因此我创建了一个视图,其中包含模式名称作为常量值,通过使用quote_literal
将模式名称括在单引号中。
这里的函数可能quote_literal
不是正确的,但无论我做什么都会用双引号括起来。
CREATE OR REPLACE FUNCTION create_summary_view_quoted(
created_view text,
common_view text,
VARIADIC schemas text[]
) RETURNS text
LANGUAGE sql AS
$$SELECT format('CREATE VIEW %I AS ', created_view) ||
string_agg(
format('SELECT %I as source_schema, * FROM %I.%I ', quote_literal(schemas[i]) , schemas[i], common_view),
' UNION ALL '
)
FROM generate_series(1, cardinality(schemas)) AS i$$;
")
将其应用到查询中
SELECT create_summary_view_quoted('newv', 'oldv', 's1', 's2', 's3');
产生
create view newv as
select
"'s1'" as source_schema,
*
from
s1.oldv
union all
select
"'s2'" as source_schema,
*
from
s2.oldv
union all
select
"'s3'" as source_schema,
*
from
s3.oldv
问题是单引号常量周围的双引号导致 Postgres 将 is 视为列名并且它会崩溃。
我通过在第一个占位符周围使用双单引号并删除该函数来修复代码生成问题quote_literal
,
即替换
format('SELECT %I as source_schema, * FROM %I.%I ', quote_literal(schemas[i]) , schemas[i], common_view),
和
format('SELECT ''%I'' as source_schema, * FROM %I.%I ', schemas[i] , schemas[i], common_view),
我的问题不在于quote_literal
函数如何始终包装任何用双引号包装单引号字符串的函数的输出。
即使当我使用函数去除模式名称中的前导后缀(因为它们是多余的)时,单引号输出也会用双引号引起来。
例如,quote_nullable(right(schemas[i],-10))
结果字符串被双引号括起来。
我可以||
在某处应用运算符,但我更喜欢引用函数。
Postgres没有内置的单引号功能吗?
我是否缺少一些必需的 SQL 语法?
这是 Postgres 的怪癖吗?
我有一个包含多个架构的数据库,这些架构具有相同的表和视图,并且我想创建一个过程,从架构中的视图之一创建视图。
CREATE OR REPLACE FUNCTION create_summary_view(
created_view character varying,
common_view character varying,
schema_1 character varying,
schema_2 character varying,
schema_3 character varying,
...
schema_x character varying,
)
create_view
是要创建的视图,common_view
是在所有模式中相同的视图,是其s 被加入到 中的schema_x
模式列表。common_view
created_view
pl/pgsql 是否有用于指示可变数量参数的语法?created_view
,common_view
并且至少one schema_x
是必需的?
我正在考虑传递一个逗号或空格分隔的模式字符串并使用regexp_split_to_array
它来分解它,但最好知道可变长度参数是可能的。
我正在编写查询,这些查询跨数据库和模式读取相同的表,我需要这些列来包含一行来自哪个模式和表。
在创建这篇文章的过程中进行搜索时,我遇到了这个答案
SELECT u.*, n.nspname as schema, u.tableoid::regclass::text as table_or_view
FROM uses u
JOIN pg_class c ON c.oid = u.tableoid
JOIN pg_namespace n ON c.relnamespace = n.oid
这现在包括架构和表或视图。
我现在还需要什么连接来添加数据库?
我在 Postgres 中运行一个查询,使用||
运算符连接一些列,似乎其中一列为空,整个结果为空。这是正常||
行为吗?
我的意思是“空白” NULL
。
我现在主要使用 Postgres 9.5,但我也需要连接到多个 Postgres 8 数据库,如果可能的话,可能将它们连接为不同的模式。外国数据库包装器是那种使这成为可能的东西,还是 Postbres 9.5 中有一些内置支持?
在 Postgres 列上创建唯一约束是否消除了对其编制索引的需要?
我希望自动需要一个索引来有效地维护约束。
PostgreSQLCOPY
命令是否可以选择将 CSV 列映射到哪些字段?
PostgreSQLCOPY
命令似乎期望目标表与其列完全匹配。我错过了什么还是它实际上是如何工作的?
是否有一些替代命令可以实现这一点?
我正在使用SQLiteStudio 3.0.7 定期转储数据库模式以进行版本控制,它似乎随机更改了表定义的顺序。这对差异造成了严重破坏,因为即使是像添加一两个额外的列这样的小变化似乎也会导致到处都是疯狂的差异。当应该显示的只是行差异时,并排比较可能会导致整个表格被单独列出。
SQLiteStudio 可以配置为正确执行此操作吗?或者 sqlite 本身可以以固定格式的方式执行相同的模式导出吗?
当我运行这样的命令时psql -d database -c 'select * from table'
orpsql -d database -f sqlcommands
psql
不会干净地终止。有趣的是,通过管道传输文件的内容而不是使用-f
选项,例如,psql -d database < sqlcommands
不会显示此行为。
我需要按或的q
要求来完成执行并返回到命令提示符吗?less
man
这是标准行为吗?是否需要一些转义以允许它干净地终止?
我有一个旧数据库的 SQL 备份,该数据库可能是我正在导入的 PostgreSQL 7 或 8 数据库,其中包含一条SET default_with_oids - true
语句,到现有的 8.4 数据库中,我想知道相关性是什么以及它可能如何影响现有数据库。
我不认为原始数据库中实际使用了 OID。我可以简单地忽略它吗?
是否有返回查询、表或视图的字段名称和字段类型的 PostgreSQL 查询或命令?
例如,如果应用于简单的 SELECT 查询的解决方案SELECT * from person
应该返回一个列表,如:
Column Name | Column Type
===========================
First Name | character
Last Name | character
Age | integer
Date of Birth | date
我查看了information_schema
下面答案中描述的视图,它似乎很好地涵盖了表格,我怀疑它也涵盖了视图,但我还没有检查过。
最后一个是任意但有效的 SELECT 查询,例如在数据库中涉及、JOINS
等 UNIONS
。是否有内置过程或其他存储过程或脚本可以为任何有效的 QUERY 返回相同的内容?
我正在开发一个创建数据和查询表单的程序,数据验证和对返回的数据执行函数需要这些信息。
查看 PostgreSQL 文档,似乎 GRANT 命令仅授予单个用户或角色。事实上,它似乎不仅仅是 PostgreSQL。
不可能做类似的事情GRANT SELECT UPDATE ON atable TO mary, bob, sue
吗?
对我来说,这似乎是一个重大遗漏,还是有某种历史原因或实际原因?
我需要能够在标准安装目录之外运行 PostgreSQL 数据库,即运行指向备用端口、配置和数据目录的现有postgres
或进程并使其运行,权限等工作正常。pg_ctl
我不希望它依赖于现有的基于包的安装设置和用户的结构/etc/postgresql
,/var/run/postgresql
但postgres
如果可能的话使用它们的可执行文件。
我不会用initdb
太多。数据将从其他安装中解压缩。唯一需要的是数据库与现有的基于包的安装的兼容性,如果它们不存在,我可以安装。由于可能存在意外的本地依赖性,使用我自己的可执行文件将是最后的手段。
Windows 在 EnterpriseDB 的一些下载中似乎在这方面得到了很好的涵盖,但似乎没有那么多可用于 Linux。