我使用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。