Проверка родительской / древовидной целостности кодов Европейского каталога отходов - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь создать базу данных, частью которой является хранение кода Европейского каталога отходов (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, 1, 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}$')
);

1 Ответ

1 голос
/ 07 ноября 2019

Я мог бы подумать о 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), ''))
    );
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...