小编tin*_*lyx的帖子

如何在 PostgreSQL 中使用 VALUES 创建临时表

我正在学习 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”处或附近的语法错误

我的问题是:

  1. 我怎样才能修正上面的说法?

  2. 我如何调整它以用于WITH block?

提前致谢。

postgresql syntax

54
推荐指数
4
解决办法
12万
查看次数

是否存在具有副作用的标准 SQL 函数?

SQL 标准是否定义了具有副作用的函数?

例如,当您执行类似操作时,它们是否具有写入文件* 或更新表某些列中的值的功能

SELECT myfunction(params...);
Run Code Online (Sandbox Code Playgroud)

我有时会看到这些,但我很好奇 SQL 标准是否也这样做。


* 这不是专门针对 PostgreSQL 的问题。我只使用了我在 PostgreSQL 中看到的副作用示例。

functions sql-standard

11
推荐指数
2
解决办法
2553
查看次数

在 Heroku 上将 pgAdmin3 连接到 Postgres

我正在运行与 Django 应用程序关联的 Heroku Postgres 数据库 ( Database )。引用附加组件的文档在这里。我认为这对社区来说是一个值得提出的问题,因为 Heroku 今天提醒其用户,它将从以前默认的共享数据库附加组件中迁移所有内容。

我在将 pgAdmin3 连接到数据库时遇到了一些问题。

按照上面链接中的说明,我使用以下命令获取数据库的凭据:

$ heroku pg:credentials HEROKU_POSTGRESQL_OLIVE
Run Code Online (Sandbox Code Playgroud)

我在 Mac OSX 上使用自制的 Postgresql 安装。

与此同时,我有:

  • 在我的 pg_postgresql.conf 中打开 SSL;
  • 添加了设置: listen_addresses = '*'
  • 并添加 host all all 0.0.0.0/0 md5
  • 并重新启动了我的 postgres 服务器。

然后我去 pgAdmin3 并选择File > Add Server.

我输入 Heroku 提供的凭据如下(第一个是 Heroku 凭据名称,第二个是 pgAdmin 字段名称):

在“属性”选项卡中:

  • dbname 到 Name;
  • 主机变成主机;
  • 端口到端口;
  • 我将“维护数据库”的 pgAdmin 字段留空;
  • 用户进入用户名;
  • 密码改成密码;

在 SSL 选项卡中:

  • 我是 SSL 的字段,我选择“需要”(按照 Heroku 的指示)。

我按回车,pgAdmin …

postgresql pgadmin

10
推荐指数
2
解决办法
2万
查看次数

了解 SELECT 列表中的集合返回函数 (SRF)

为什么在 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 set-returning-functions

9
推荐指数
1
解决办法
4271
查看次数

PostgreSQL 的正确存储大小估计技术

我们正在为生产使用准备一个 PostgreSQL 数据库,我们需要估计这个数据库的存储大小。我们是一个在数据库管理方面缺乏专业知识的开发人员团队,因此我们正在研究、阅读手册并使用我们的一般信息技术知识来实现​​这一目标。

我们有实际数据要迁移到这个数据库,并对增长有一些粗略的估计。为了这个例子,假设我们估计每年增长 50%。

关键是:进行良好尺寸估计的一般正确技术是什么?

我们根据以下规则估算存储使用量。我们需要建议的主题用粗体文本标记。非常欢迎对整个过程的反馈:

  1. 估计每个表的大小
    1. 发现每一行的实际大小。
      • 对于具有固定大小的字段(如bigintchar等),我们使用文档中描述的大小
      • 对于具有动态大小的字段(如text),我们估计了字符串长度并使用了函数select pg_column_size('expected text here'::text)
      • 我们为PostgreSQL 内部使用的OID增加了 4 个字节
    2. 将每行的大小乘以估计的行数
    3. 我是否需要在这里考虑任何开销,例如行或表元数据?
  2. 估计每个表索引的大小
    • 不知道如何估计,这里需要建议
  3. 估计事务日志的大小
    • 不知道如何估计,这里需要建议
  4. 估计备份的大小(完整和增量)
    • 不知道如何估计,这里需要建议
  5. 对实际最小尺寸的所有估计求和

  6. 对 1 年后的最小规模的估计值 1、2 和 4 的总和应用 1.5 倍(增长 50%)的系数

  7. 应用 1.2 ~ 1.4(多 20% 到 40%)的总体系数来估计 5 和 6 以获得良好的安全裕度

我知道规则变得相当广泛。让我知道是否需要示例以更好地理解。

postgresql database-size scalability

8
推荐指数
2
解决办法
2万
查看次数

如何将 RETURNS TABLE 与 PostgreSQL 中的现有表一起使用?

来自此处的 PostgreSQL文档

还有另一种方法可以将函数声明为返回一个集合,即使用语法 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),但没有用。

postgresql set-returning-functions postgresql-9.5

8
推荐指数
1
解决办法
6088
查看次数

为什么 NoSQL 数据库不符合 ACID?

没有 ACID 属性意味着数据库在集群上运行良好。但 ACID 是非常基础的东西。如果没有原子性、一致性、隔离性和持久性(ACID),数据库如何运行良好?

nosql

8
推荐指数
1
解决办法
1万
查看次数

如何将 PostgreSQL 10 标识列添加到现有表中?

我正在阅读有关新的Postgres 10 标识列的信息,并了解了如何使用它SERIALCREATE 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,只是想检查这是否可行。

postgresql alter-table identity postgresql-10

8
推荐指数
1
解决办法
7449
查看次数

授予权限

我有一个数据库角色、-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)

sql-server-2008

6
推荐指数
1
解决办法
192
查看次数

如何更改 array_agg() 以在 PostgreSQL 中的空输入上返回空数组?

我正在尝试编写一个 PostgreSQL array_agg() 变体,它返回空数组'{}'而不是 NULL。为了避免自定义聚合函数对性能的影响CREATE AGGRGATE,我尝试重新使用内置的array_agg_transfnarray_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 aggregate array

6
推荐指数
0
解决办法
1万
查看次数