允许某些值绕过插入到PostgreSQL表中的外键约束

时间:2018-03-15 00:22:00

标签: database postgresql foreign-keys constraints

我使用PostgreSQL表存储文件结构,我希望能够允许某些文件(即home ~)绕过我放在一个上的外键约束列。

我的表格创建如下:

CREATE TABLE files_table (
    id serial PRIMARY KEY,
    file_name TEXT NOT NULL,
    parent integer,
    -- version_num_type is a composite type three smallints.
    -- version_list is a separate table containing valid version numbers
    version version_num_type NOT NULL REFERENCES version_list,
    -- full_path is column in this table I didn't include here that contains the
    -- complete file name, starting at root '~'
    CONSTRAINT file_unique_check UNIQUE(version, full_path)
);

我最初想要添加的约束是:

CONSTRAINT valid_parent_file FOREIGN KEY parent REFERENCES files_table(id);

由于版本只是定期添加,我可以使用如下查询禁用此约束:

ALTER TABLE files_table DISABLE CONSTRAINT valid_parent_file;

然后在我添加新版本的表后重新启用约束。不幸的是,这需要用户向表中添加内容以获得ALTER TABLE权限,这对我来说似乎是不必要的,并且我希望尽可能地限制生产数据库凭据。

我想知道如果它的file_name列等于~,是否有可能允许某些事情绕过约束,因为第一行我会为每个新增加一行version将是根目录,其父级将只是NULL。它应该仍然检查唯一性,因此它不能绕过所有约束。

在定义约束或定义查询时,是否有一种方法可以允许插入在条件上绕过外键约束?

这是一个说明我的意思的例子:

id     file_name     parent   version_num_type
1      ~             NULL     (1,0,0)
2      foo/          1        (1,0,0)
3      bar.txt       2        (1,0,0)

然后我希望能够添加:

id     file_name     parent   version_num_type
4      ~             NULL     (1,1,0)

因为即使其父值为NULL,它也是新版本的根,因此它不需要父版本。

但是尝试插入其中任何一个都应该失败:

id     file_name     parent   version_num_type
5      foo/          NULL     (1,1,0)
5      foo/          17       (1,1,0)

第一个会失败,因为它的父级是NULL而它不是根,而第二个会失败,因为它引用的是尚未在表中的父ID。

0 个答案:

没有答案
相关问题