针对欧洲废物目录代码的父/树参照完整性检查

我正在尝试创建一个数据库,其中一部分涉及存储欧洲废物目录(EWC)代码。

EWC码是2位数,4位数或6位数的等级代码,其中前2个字符代表章节,后2个字符代表子章节,后2个字符代表废品描述。

例如:
02来自农业,园艺,水产养殖,林业,狩猎和渔业,食品制备与加工的废物
0202来自准备和加工肉类的废物。鱼和其他动物性食品
020203种不适合消费或加工的材料

整个树都需要存储,因此我想确保在创建子记录时父级存在。

但是...我对如何解决这个问题有些困惑。没有直接引用列的外键(即:首先尝试调用函数)会触发语法错误:

...
foreign key substring(ewc_code,1,length(ewc_code) - 2) references cdsw_data.ewc_codes (ewc_code) match simple on update restrict on delete cascade
...
ERROR:  syntax error at or near "substring"
LINE 5:  foreign key substring(ewc_code,length(ewc_code) - 2) re...

请问有人可以指导我寻求适当的解决方案吗?

表结构:

create table cdsw_data.ewc_codes (
    ewc_code varchar(6) primary key,ewc_descrition text,constraint valid_ewc check(ewc_code ~ '^(\d\d){1,3}$')
);
gaosumei 回答:针对欧洲废物目录代码的父/树参照完整性检查

我可以想到3种方法:

  • 使用3个不同的表,一个包含一个两位数的列,一个包含两个两位数的列,一个包含三个两位数的列。使用那些作为复合主键。声明对父表的列的外键引用。具有一个(可能是重载的)函数来将完整密钥计算为单个字符串。
  • 使用触发函数进行所有完整性检查
  • 使用一个可用作外键并断言具有期望值的帮助器列:

    create table cdsw_data.ewc_codes (
        ewc_code varchar(6) primary key,ewc_parentcode varchar(4) references cdsw_data.ewc_codes,ewc_description text,constraint valid_ewc check(ewc_code ~ '^(\d\d){1,3}$'),constraint parent check(ewc_parentcode is not distinct from 
                                null_if(left(ewc_code,-2),''))
    );
    
本文链接:https://www.f2er.com/3150467.html

大家都在问