У меня есть таблица CPT, определенный сКак использовать каскадное удаление vs для ограничения ссылочной целостности с отношениями записи один к одному?
TABLE cpt
(
recid serial NOT NULL,
ccpt text,
cdesc text NOT NULL,
ninsurance numeric(10,2),
ncash numeric(10,2),
.....)
В которой я хочу, чтобы переместить значения ninsurance и ncash к другой записи в таблице CPT. Поэтому я перехожу эти значения в другой таблице, cpt_invoice, который определяется как
TABLE cpt_Invoice
(
recid serial NOT NULL,
cpt_recid integer NOT NULL, <--primary key from the cpt table.
ninsurance numeric(10,2),
ncash numeric(10,2),
CONSTRAINT cs_cpt_invoice FOREIGN KEY (cpt_recid)
REFERENCES cpt (recid) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
.....)
Сокращение таблицы ЕКПП:
TABLE cpt
(
recid serial NOT NULL,
ccpt text,
cdesc text NOT NULL,
.....)
До сих пор так хорошо. Теперь то, что это лучший способ, чтобы обеспечить соблюдение следующих contstraints:
- Запись в cpt_invoice не могут быть удалены, если какая-либо запись в СРТ на него ссылаются, и
- Если запись в СРТ удаляется, то ссылаемая запись в cpt_invoice также удаляется.
Примечание. Эти таблицы являются взаимно однозначными, поскольку каждая запись в cpt будет иметь одну и только одну запись в cpt_invoice и наоборот.
Единственная мысль, которая приходит на ум, чтобы добавить первичный ключ cpt_invoice к столу CPT, то на столе CPT сделать
ЛИТЕРАТУРЫ cpt_invoice (RECID) ON DELETE RESTRICT
Значит ли использование обратной ссылки имеет смысл? Как это делают другие?
ТИА
О чем вы спрашиваете? Разве вы не находите предложение 'on delete restrict'? –
@ Стр. Да ... но, насколько я понимаю, это приведет к тому, что cpt_invoice перестанет удаляться, если он используется где угодно. Однако, как тогда реализовать # 2, не вызывая цикл, когда запись cpt удаляется. то есть я хотел бы удалить запись cpt, чтобы удалить cpt_invoice. Эти таблицы являются взаимно однозначными. :) –