PostgreSQL 有一个包含不同高可用性选项的矩阵,这些选项代表了将复制构建到 RDBMS 中的许多不同方式。
问题
我有一块在 PostgreSQLSQL中创建了TABLE一个SELECT语句;我想向表中添加约束,例如,一列不能是null.
我在 Postgres 文档中找不到对此有效的 SQL,因此似乎不可能。
实现这种功能的最佳方法是什么?如果违反约束,我希望表的创建失败。
我无法预先创建带有约束的表,因为某些列可能存在一些变化,因为它们是动态过程的结果。
参考如何从 PostgreSQL 中的选择查询将值插入表中?,
我想从另一个表行插入,由 SELECT DISTINCT 指定,加上一些静态值,例如:
INSERT INTO new_tbl (column1, column2, column3)
SELECT DISTINCT id FROM -- long where clause --,
'a string', 0;
Run Code Online (Sandbox Code Playgroud)
这样新表中的每一行都会为 column2 和 column3 获得相同的值这可能吗?
还有另一种方法可以将函数声明为返回一个集合,即使用语法 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),但没有用。
我有一个带有键(bigint) 和值(double)的 PostgreSQL 表。该表有数百亿行。我在 ( key , value )上有一个 btree 用于按键辅助查找。该表永远不会更新。
我在这个表上执行的唯一查询是在键上的相等谓词以获取相应的value,它利用了 B 树。
PostgreSQL 消耗的存储在这里很糟糕。它将OID、key、value存储在表中,并将key、value存储在索引中。我本质上是将所有东西存储两次!
如何配置此表以节省空间?理想情况下,如何在 B 树中只存储一次元组。
我在 Compose.io 中有一个 Postgres DB 部署,我正在为我的应用程序使用标准的“compose”数据库。我想清除当前的数据库内容,以便可以使用新模式重新创建数据库。我已经读过,最好的方法是使用“删除模式公共级联”,但是当我尝试在我的数据库上执行此操作时,我得到了
ERROR: must be owner of schema public
Run Code Online (Sandbox Code Playgroud)
事实证明,模式不是由admin(撰写提供 psql 访问的用户)拥有,而是由名为focker.
compose=> \dn
List of schemas
Name | Owner
--------+--------
public | focker
(1 row)
Run Code Online (Sandbox Code Playgroud)
我尝试更改架构所有者,但失败并出现与上述相同的错误。
为什么我的数据库是这样设置的?有什么方法可以更改它以便管理员用户可以清除数据库吗?
给定一个可能包含多个分隔符实例的字符串,我想生成从该字符开始的所有子字符串。
例如,给定一个像'a.b.c.d.e'(或 array {a,b,c,d,e},我想)这样的字符串,我想生成一个像这样的数组:
{a.b.c.d.e, b.c.d.e, c.d.e, d.e, e}
Run Code Online (Sandbox Code Playgroud)
预期用途是作为填充一列的触发器,以便在写入另一列时更容易地查询域名部分(即,查找全部q.x.t.com以进行查询t.com)。
解决这个问题似乎是一种笨拙的方法(而且很可能是),但现在我很好奇如何用(Postgres')SQL 编写这样的函数。
这些是电子邮件域名,因此很难说元素的最大可能数量是多少,但绝大多数肯定会小于 5。
是否可以在 Postgres 中创建某种分组链?假设我有以下图表:
CREATE TABLE foo AS
SELECT row_number() OVER () AS id, *
FROM ( VALUES
( 'X', 'D', 'G', 'P' ),
( 'F', 'D', 'L', 'M' ),
( 'X', 'N', 'R', 'S' ),
( 'Y', 'I', 'W', NULL ),
( 'U', 'Z', 'E', NULL )
) AS f(a,b,c,d);
id | a | b | c | d
------------------
1 | X | D | G | P
2 | F | D | L | M
3 | …Run Code Online (Sandbox Code Playgroud) 有没有人为 pgAdmin 版本和 PostgreSQL 版本整理过版本兼容性矩阵?
以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。
这是我的功能:
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我会添加一个触发器,如:
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)
但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?
postgresql ×10
aggregate ×1
array ×1
constraint ×1
functions ×1
insert ×1
oracle ×1
performance ×1
pgadmin ×1
plpgsql ×1
trigger ×1