我正在学习 PostgreSQL 并试图弄清楚如何创建一个临时表或一个WITH可以用来代替常规表的声明,以用于调试目的。
我查看了CREATE TABLE的文档,它说VALUES可以用作查询,但没有给出示例;VALUES其中链接的条款的文档也没有示例?
所以,我写了一个简单的测试如下:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Run Code Online (Sandbox Code Playgroud)
但是 PostgreSQL (9.3) 抱怨
“AS”处或附近的语法错误
我的问题是:
我怎样才能修正上面的说法?
我如何调整它以用于WITH block?
提前致谢。
SQL 标准是否定义了具有副作用的函数?
例如,当您执行类似操作时,它们是否具有写入文件* 或更新表某些列中的值的功能
SELECT myfunction(params...);
Run Code Online (Sandbox Code Playgroud)
我有时会看到这些,但我很好奇 SQL 标准是否也这样做。
* 这不是专门针对 PostgreSQL 的问题。我只使用了我在 PostgreSQL 中看到的副作用示例。
我正在运行与 Django 应用程序关联的 Heroku Postgres 数据库 ( Database )。引用附加组件的文档在这里。我认为这对社区来说是一个值得提出的问题,因为 Heroku 今天提醒其用户,它将从以前默认的共享数据库附加组件中迁移所有内容。
我在将 pgAdmin3 连接到数据库时遇到了一些问题。
按照上面链接中的说明,我使用以下命令获取数据库的凭据:
$ heroku pg:credentials HEROKU_POSTGRESQL_OLIVE
Run Code Online (Sandbox Code Playgroud)
我在 Mac OSX 上使用自制的 Postgresql 安装。
与此同时,我有:
listen_addresses = '*'host all all 0.0.0.0/0 md5然后我去 pgAdmin3 并选择File > Add Server.
我输入 Heroku 提供的凭据如下(第一个是 Heroku 凭据名称,第二个是 pgAdmin 字段名称):
在“属性”选项卡中:
在 SSL 选项卡中:
我按回车,pgAdmin …
为什么在 SELECT 列表中使用 Set Returning Function (SRF) 与在 FROM 子句中使用 SRF 在行为上存在差异?
例如,对于返回 2 行的简单 SRF:
CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
RETURNS SETOF record AS $$
SELECT 1,1
UNION
SELECT 2,2;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
SELECT gen_series(); 返回两个单列行,每个行包含一条记录:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
Run Code Online (Sandbox Code Playgroud)
而SELECT * FROM gen_series();返回扩展记录的两行:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
Run Code Online (Sandbox Code Playgroud)
相比之下,如果 SRF 返回单个列,则在 SELECT 或 FROM 子句中调用 SRF 没有区别。例如:
=> SELECT generate_series(1,2);
generate_series
----------------- …Run Code Online (Sandbox Code Playgroud) 我们正在为生产使用准备一个 PostgreSQL 数据库,我们需要估计这个数据库的存储大小。我们是一个在数据库管理方面缺乏专业知识的开发人员团队,因此我们正在研究、阅读手册并使用我们的一般信息技术知识来实现这一目标。
我们有实际数据要迁移到这个数据库,并对增长有一些粗略的估计。为了这个例子,假设我们估计每年增长 50%。
关键是:进行良好尺寸估计的一般正确技术是什么?
我们根据以下规则估算存储使用量。我们需要建议的主题用粗体文本标记。非常欢迎对整个过程的反馈:
bigint、char等),我们使用文档中描述的大小text),我们估计了字符串长度并使用了函数select pg_column_size('expected text here'::text)对实际最小尺寸的所有估计求和
对 1 年后的最小规模的估计值 1、2 和 4 的总和应用 1.5 倍(增长 50%)的系数
应用 1.2 ~ 1.4(多 20% 到 40%)的总体系数来估计 5 和 6 以获得良好的安全裕度
我知道规则变得相当广泛。让我知道是否需要示例以更好地理解。
还有另一种方法可以将函数声明为返回一个集合,即使用语法 RETURNS TABLE(columns)。... 这种表示法是在 SQL 标准的最新版本中指定的,因此可能比使用 SETOF 更具可移植性。
这听起来好像RETURNS TABLE是返回多行的更新、更便携的样式。但我不确定这两种语法是否等效。
我想知道我们是否真的可以RETURNS TABLE用来代替 RETURNS SETOF?
特别是,我还没有弄清楚的一种情况是:如果我们有一个现有的表foo及其关联的复合类型,我们如何在 中使用它RETURNS TABLE?
使用上述链接的示例,可以使用以下内容重写RETURNS TABLE:
CREATE TABLE foo (fooid int, foosubid int, fooname text);
CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$
SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试使用RETURNS TABLE (foo.*)and RETURNS TABLE (foo),但没有用。
没有 ACID 属性意味着数据库在集群上运行良好。但 ACID 是非常基础的东西。如果没有原子性、一致性、隔离性和持久性(ACID),数据库如何运行良好?
我正在阅读有关新的Postgres 10 标识列的信息,并了解了如何使用它SERIAL在CREATE TABLE.
是否也可以向现有表添加标识列?
例如,使用旧SERIAL列,我可以执行以下操作:
ALTER TABLE sourceTable ADD COLUMN ogc_fid SERIAL;
Run Code Online (Sandbox Code Playgroud)
对于标识列,是否有与上述相同的内容?我试过:
ALTER TABLE sourceTable ADD COLUMN ogc_fid GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)
但是得到了一个错误:
错误:“BY”第 1 行或附近的语法错误:...R TABLE sourceTable ADD COLUMN ogc_fid GENERATED BY DEFAULT
我正在考虑用我的脚本中的SERIAL列替换列IDENTITY,只是想检查这是否可行。
我有一个数据库角色、-login 和用户
CREATE LOGIN dummyLogIn WITH PASSWORD = 'dummyPassword', CHECK_POLICY = OFF;
CREATE USER dummyUser FOR LOGIN dummyLogIn;
CREATE ROLE "dummyRole";
Run Code Online (Sandbox Code Playgroud)
与角色相关的用户:
EXECUTE sp_addrolemember N'dummyRole', N'dummyUser';
Run Code Online (Sandbox Code Playgroud)
一切都很好。
现在我将 select WITH GRANT OPTION 授予指定表的组:
GRANT SELECT ON "dbo"."mytable" TO dummyRole WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)
仍然一切正常。如果我在 ssms 中查找角色的首选项,我会看到“dummyUser”是该角色的成员,并且该角色对 myTable 具有 SELECT 权限,包括授予选择的权限(两个复选框都在首选项窗口中进行了标记)
如果我尝试向另一个组授予选择权限,该权限肯定存在,我会收到一条错误消息(没有 15151):无法搜索对象“myTable”,因为对象不存在或必要的权限不存在。(错误消息是德语;))。
我可以轻松地在上述表格上进行选择 - 所以我假设该对象确实存在。在我看来,我应该能够向另一个组授予选择权限。
@附加:
引发错误的查询:
GRANT SELECT ON "dbo"."mytable" TO childDummyRole(以用户dummyUser登录)
childDummyRole 和引用对象的创建方式与上述对象相同:
CREATE LOGIN childDummyLogIn WITH PASSWORD = 'childDummyPassword', CHECK_POLICY = …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 PostgreSQL array_agg() 变体,它返回空数组'{}'而不是 NULL。为了避免自定义聚合函数对性能的影响CREATE AGGRGATE,我尝试重新使用内置的array_agg_transfn和array_agg_finalfn。从文档中的代码示例开始,类似于 array_agg 的初始版本可以工作(作为数据库超级用户):
CREATE AGGREGATE array_agg_z (anynonarray)
(
sfunc = array_agg_transfn,
stype = internal,
finalfunc = array_agg_finalfn,
finalfunc_extra
);
Run Code Online (Sandbox Code Playgroud)
它按预期在空输入上返回 NULL:
=> SELECT array_agg_z(i) IS NULL FROM (SELECT 0 WHERE 1 = 2) t(i);
?column?
----------
t
(1 row)
Run Code Online (Sandbox Code Playgroud)
现在,要更改array_agg_z()为在空输入上返回空数组,我尝试将其设置initcond为'{}'如下:
CREATE AGGREGATE array_agg_z (anynonarray)
(
sfunc = array_agg_transfn,
stype = internal,
finalfunc = array_agg_finalfn,
initcond = '{}',
finalfunc_extra
); …Run Code Online (Sandbox Code Playgroud) postgresql ×7
aggregate ×1
alter-table ×1
array ×1
functions ×1
identity ×1
nosql ×1
pgadmin ×1
scalability ×1
sql-standard ×1
syntax ×1