相关疑难解决方法(0)

Postgres:SQL列出表外键

有没有办法使用SQL列出给定表的所有外键?我知道表名/模式,我可以将其插入.

sql postgresql

192
推荐指数
16
解决办法
15万
查看次数

如何以编程方式检查行是否可删除?

假设我们有一个像这样的PostgreSQL表:

CREATE TABLE master (
    id INT PRIMARY KEY,
    ...
);
Run Code Online (Sandbox Code Playgroud)

以及使用外键引用它的许多其他表:

CREATE TABLE other (
    id INT PRIMARY KEY,
    id_master INT NOT NULL,
    ...
    CONSTRAINT other_id_master_fkey FOREIGN KEY (id_master)
                                    REFERENCES master (id) ON DELETE RESTRICT
);
Run Code Online (Sandbox Code Playgroud)

有没有办法检查(从触发器功能内)主行是否可删除而不实际尝试删除它?显而易见的方法是逐个对所有引用表执行SELECT,但我想知道是否有更简单的方法.

我需要这个的原因是我有一个包含分层数据的表,其中任何行都可以有子行,并且只有层次结构中最低的子行可以被其他表引用.因此,当一行即将成为父行时,我需要检查它是否已在任何地方引用.如果是,则它不能成为父行,并且拒绝插入新的子行.

sql postgresql database-design plpgsql sql-delete

5
推荐指数
1
解决办法
1977
查看次数

信息模式中referential_constraints.unique_constraint_* 列的NULL 值

在 Postgres 10 中我声明了以下内容:

create table test_abc (
    pk integer not null,
    id integer not NULL,
    id2 integer not null,
    PRIMARY KEY (pk)
);
CREATE UNIQUE INDEX test_abc_ids ON test_abc(id,id2);
Run Code Online (Sandbox Code Playgroud)

然后是第二个表,其中 FK 引用第一个表:

create table test_def (
    id integer not null,
    abc_id integer,
    abc_id2 integer,
    PRIMARY KEY (id),
    FOREIGN KEY (abc_id,abc_id2) references test_abc(id,id2)
);
Run Code Online (Sandbox Code Playgroud)

现在考虑此查询的输出:

SELECT unique_constraint_catalog, unique_constraint_schema, unique_constraint_name
FROM   information_schema.referential_constraints r
WHERE  r.constraint_name = 'test_def_abc_id_fkey'
----------------------
NULL NULL NULL
Run Code Online (Sandbox Code Playgroud)

所有unique_constraint_*列都有空值。

Postgres 文档看来这些元列应该包含

包含外键约束引用的唯一或主键约束的 [object] 的名称(始终是当前数据库) …

sql postgresql foreign-keys information-schema database-metadata

4
推荐指数
1
解决办法
676
查看次数