标签: postgresql

Postgres 外键只有部分列的 ON DELETE SET NULL

我在表中添加了一个(新的)第二个外键a。它的第一个外键是可选的,因此ON DELETE SET NULL对外键的约束。第二届外键是强制性的,因此(新)的约束NOT NULLa1,并a2与(新)的约束ON DELETE CASCADE外键。第二个外键还包含第一个外键的列的子集。

CREATE TABLE a
(
  a0 INTEGER NOT NULL PRIMARY KEY,
  -- other columns
  a1 INT NOT NULL,
  a2 INT NOT NULL,
  a3 INT,
  a4 INT,
  FOREIGN KEY (a1, a2)         REFERENCES b ON DELETE CASCADE,
  FOREIGN KEY (a1, a2, a3, a4) REFERENCES c ON DELETE SET NULL
);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,我现在可以不再DELETE FROM c,因为这将无效并NOT NULL在限制a1a2。在此类删除的情况下,我希望发生的是a1, a2 …

postgresql foreign-key postgresql-9.4

7
推荐指数
1
解决办法
5315
查看次数

如何在 ubuntu/debian/linux 上检查 pg_hba.conf 和其他 postgresql conf 文件的语法?

很多时候,postgresql 服务在一些配置更改后无法重新启动。

是否有任何命令行工具允许在重新加载/重新启动服务之前检查pg_hba.conf和其他 pg*.conf文件的语法,或者在任何配置更改之后检查更好?

postgresql linux ubuntu configuration pg-hba.conf

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

Postgresql json列查看

我有一张看起来像这样的桌子

id |   json_column
---+------------
 1 | {"text1":"a", "text2":"b", "text3":"c", ....}
 2 | {"text1":"b", "text2":"c", ....}
Run Code Online (Sandbox Code Playgroud)

我希望它像这样

text1 | text2 | text3 | ....
a     | b     | c     | ....
b     | c     | d     | ....
Run Code Online (Sandbox Code Playgroud)

我发现得到这个结果的一个变体是使用 json_populate_record() 并创建一个新类型 x as (text1 text, text2 text, text3 text,....) 所以我可以执行

select (json_populate_record(null::x, json_column)).* from table
Run Code Online (Sandbox Code Playgroud)

有没有另一种方法可以在不创建上述类型的情况下做到这一点?所有新列都可以有类型文本,那么可能有快捷方式吗?

我的问题是我在 aaaa_bbbb_cccc_d 形式的一个 json 字段中有 50 个键,因此手动为此创建一种类型会花费很多时间

我正在使用 9.5.4

postgresql json postgresql-9.5

7
推荐指数
1
解决办法
6414
查看次数

Postgresql:29/E4624520 处的记录长度无效,但复制看起来不错

这是什么错误?我看到复制工作正常,但我不确定数据是否已损坏。

我可以安全地忽略此错误吗?

postgresql replication write-ahead-logging

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

在 PostgreSQL 中的所有 last_modified 列上创建触发器

在 PostgreSQL 9.5 中,我有表格中的列

prefix_last_modified timestamp without time zone NOT NULL DEFAULT  (clock_timestamp() AT TIME ZONE 'UTC')
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来设置在每次更新行时自动更新的最后修改的值,我发现这篇定义函数的好帖子

CREATE OR REPLACE FUNCTION update_modified_column() 
RETURNS TRIGGER AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW; 
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

现在,我想知道是否有任何方法可以将列名传递给 PostgreSQL 函数并将其执行到NEW行?例如

CREATE OR REPLACE FUNCTION update_modified_column(varchar column)   
    RETURNS TRIGGER AS $$
    BEGIN
        NEW.column = now();
        RETURN NEW; 
    END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

postgresql trigger row-modification-time

7
推荐指数
1
解决办法
6300
查看次数

为什么按主键分组时可以选择所有字段,而按另一列分组时却不能选择所有字段

这是如何有效的语句(其中 id 是表的主键):

select * from table group by id ;
Run Code Online (Sandbox Code Playgroud)

这不是:

select * from table group by name ;
Run Code Online (Sandbox Code Playgroud)

错误:列“pgluster.id”必须出现在 GROUP BY 子句中或用于聚合函数中

小提琴

问题是为什么第一个是合法查询,即为什么按主键分组是有效的?

postgresql select group-by

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

如何使用 EXECUTE 在动态 SQL 中使用函数参数?

我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。

下面是我的功能:

CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state     text, district text, organizationId text, bloodGroup text, status text,   approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
  concat_ws(' AND '
    , CASE WHEN state IS NOT NULL THEN 'state = $2' END
    , CASE WHEN district IS NOT NULL THEN 'district = $3' END
    , CASE WHEN bloodGroup IS NOT NULL THEN …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql parameter plpgsql postgresql-9.5

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

Postgres 无法从客户端接收数据:连接超时

我是 sql DBA,正在学习 postgres ..在 postgres 日志中,我经常收到“无法从客户端接收数据:连接超时”我没有除此之外的任何其他日志

不知道如何排除故障?我检查了应用程序日志和 DBs 日志以比较时间,但我没有注意到任何异常。

有人可以指导我如何追踪这个问题。

谢谢

postgresql timeout

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

具有 AT TIME ZONE 和 UTC 偏移量的奇数

我不明白这两列之间的区别。美国/芝加哥时区是 UTC-6,所以我希望两者都返回相同的结果:

select timezone('America/Chicago', '2017-01-01 12:00:00'::TIMESTAMP AT TIME ZONE 'UTC'),
       timezone('UTC-6'          , '2017-01-01 12:00:00'::TIMESTAMP AT TIME ZONE 'UTC');
Run Code Online (Sandbox Code Playgroud)

然而,结果是:

2017-01-01 06:00:00 | 2017-01-01 18:00:00
Run Code Online (Sandbox Code Playgroud)

而且,这种行为非常尴尬,

SELECT '1:00 -1'::time with time zone AT TIME ZONE '-1'; 
  timezone   
-------------
 03:00:00+01
Run Code Online (Sandbox Code Playgroud)

谁能解释一下?

postgresql timestamp utc-time timezone

7
推荐指数
1
解决办法
3050
查看次数

如何让 psql 提示超级用户 postgres 输入密码?

我在 Windows 7 上使用 PostgreSQL 9.6.2,当我从命令提示符启动 psql 时:

psql -U myusername 
Run Code Online (Sandbox Code Playgroud)

它要求输入密码并登录。但是如果我这样做:

psql -U postgres
Run Code Online (Sandbox Code Playgroud)

它会以超级用户权限直接登录到主数据库,而无需输入任何类型的密码。如果我输入:

psql -U postgres -W 
Run Code Online (Sandbox Code Playgroud)

然后它会询问 su 密码,顺便说一下,这是我在一键安装过程中设置的密码。

我已经检查过了pg_hba.conf,它被设置md5为所有用户,所有数据库。我什postgres=# ALTER USER postgres PASSWORD 'myPassword';至用: 更改了数据库中的密码,但无济于事。

问题是为什么当我以普通用户身份登录时它要求输入密码而当我以超级用户身份登录时却没有?这不是主要问题,因为在任何一种情况下我都可以访问我的数据库,但它似乎根本不安全。任何解决方法将不胜感激。

postgresql authentication windows postgresql-9.6

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