Можно ли использовать ограничения внешнего ключа для предотвращения создания дубликатов?
О дубликатах
Нет, вы используете либо PRIMARY KEY
или NOT NULL UNIQUE
для предотвращения дублирования.Эта декларация
CREATE TABLE "finaldata" (
"FdataID" serial primary key,
гарантирует, что каждая строка будет уникальной, но она не гарантирует, что то, что представляет строка - то, чем интересуются разработчики баз данных - будет уникальным.Позвольте привести пример меньшего размера.
create table person (
person_id serial primary key,
full_name varchar(35) not null
);
insert into person (full_name) values ('Mendez, Cathy');
insert into person (full_name) values ('Mendez, Cathy');
insert into person (full_name) values ('Mendez, Cathy');
insert into person (full_name) values ('Mendez, Cathy');
insert into person (full_name) values ('Mendez, Cathy');
select * from person;
--
1 Mendez, Cathy
2 Mendez, Cathy
3 Mendez, Cathy
4 Mendez, Cathy
5 Mendez, Cathy
Серийный идентификационный номер делает каждую строку уникальной, но она ничего не делает для того, что представляет строка.Если я сделал это
delete from person;
alter table person
add constraint person_uniq unique (full_name);
, то эта вставка будет выполнена успешно,
insert into person (full_name) values ('Mendez, Cathy');
, но при повторном запуске с этой ошибкой.
ERROR: duplicate key value violates unique constraint "person_uniq"
SQL state: 23505
Detail: Key (full_name)=(Mendez, Cathy) already exists.
Итакчтобы избежать дублирования в таблице finaldata, вам нужно УНИКАЛЬНОЕ ограничение для некоторого подмножества столбцов.
Моя догадка - и это всего лишь предположение - состоит в том, что вам нужно по крайней мере {"Pid", "Sid"," SidOrig "," Параметр "}.
О внешних ключах
Внешние ключи гарантируют, что значения, введенные в один набор столбцов, уже существуют в другой таблице .
Например, значения в столбце finaldata.pid, вероятно, уже существуют в другой таблице.Если набор значений в столбцах finaldata {"Pid", "Sid", "SidOrig", "Parameter"}, как предполагается, уже существует в таблице obx, то ограничение внешнего ключа, подобное этому, не позволит бессмысленным данным найти их.путь в эти столбцы finaldata.
constraint finaldata_fk1
foreign key ("Pid", "Sid", "SidOrig", "Parameter")
references obx ("Pid", "Sid", "SidOrig", "Parameter")
Вам также может понадобиться on delete cascade
, on update cascade
или какое-либо другое ссылочное действие.
Внешний ключ будет работать только при наличии уникального ограничения на указанные столбцы.У вас еще нет одного из них.Вам понадобится уникальное ограничение на столбцы obx {"Pid", "Sid", "SidOrig", "Parameter"}, чтобы это конкретное ограничение внешнего ключа работало.