Допустим, у нас есть следующая таблица:
drop table if exists modeling.pl_example_table;
create table modeling.pl_example_table (
animal_name text,
animal_id int
);
insert into modeling.pl_example_table (animal_name, animal_id) values
('lion', 1),
('dog', null),
('cat', 2),
('catt', null);
Я хочу создать вспомогательную таблицу, в которой будут перечислены все возможные значения animal_name
.animal_name
должен иметь соответствующий animal_id
.Эта информация будет храниться в следующей таблице, которую я инициализирую с помощью animal_name
s, которые имеют не-NULL
animal_id
:
drop table if exists modeling.pl_example_dictionary cascade;
create table modeling.pl_example_dictionary as (
select animal_id as id, animal_name
from modeling.pl_example_table
where animal_id is not null);
pl_example_dictionary
не должно иметь значение NULL animal_id
и animal_name
должен быть уникальным (например, лошадь не может иметь animal_id
как 1, так и 151).Для этого я использую следующие ограничения:
alter table modeling.pl_example_dictionary add primary key(animal_name);
alter table modeling.pl_example_dictionary add primary key(id); -- more than one PK is not allowed
create sequence modeling.pl_example_dictionary_seq owned by modeling.pl_example_dictionary.id;
alter table modeling.pl_example_dictionary alter column id set default nextval('modeling.pl_example_dictionary_seq');
Я не знаю, как справиться с тем фактом, что в таблице не может быть двух первичных ключей.Также есть проблема с последовательностью, которая начинается не с 3, а с 1 (желательно, чтобы последовательность была параметризована как select max(animal_id) from modeling.pl_example_dictionary;
.