0

У меня есть таблица 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:

  1. Запись в cpt_invoice не могут быть удалены, если какая-либо запись в СРТ на него ссылаются, и
  2. Если запись в СРТ удаляется, то ссылаемая запись в cpt_invoice также удаляется.

Примечание. Эти таблицы являются взаимно однозначными, поскольку каждая запись в cpt будет иметь одну и только одну запись в cpt_invoice и наоборот.

Единственная мысль, которая приходит на ум, чтобы добавить первичный ключ cpt_invoice к столу CPT, то на столе CPT сделать

ЛИТЕРАТУРЫ cpt_invoice (RECID) ON DELETE RESTRICT

Значит ли использование обратной ссылки имеет смысл? Как это делают другие?

ТИА

+0

О чем вы спрашиваете? Разве вы не находите предложение 'on delete restrict'? –

+0

@ Стр. Да ... но, насколько я понимаю, это приведет к тому, что cpt_invoice перестанет удаляться, если он используется где угодно. Однако, как тогда реализовать # 2, не вызывая цикл, когда запись cpt удаляется. то есть я хотел бы удалить запись cpt, чтобы удалить cpt_invoice. Эти таблицы являются взаимно однозначными. :) –

ответ

2

Я написал бы cpt_Invoice так:

-- mixed case not recommended 
create table TABLE cpt_invoice ( 
    recid serial NOT NULL, 
    cpt_recid integer references cpt (recid) on delete cascade, 
    ninsurance numeric(10,2) 
    -- more... 
) 

и вы сможете удалить запись из cpt с автоматическим удалением всех зависимых записей в cpt_invoice (требование встречи 2).

Ваше требование 1 не имеет смысла: каждая запись в cpt_invoice зависит от одного в cpt.

Редактировать: Я не знаю, что ваша среда или приложение, для большей безопасности смотрите на функции the SQL GRANT, вы можете ограничить пользователей определенными действиями.

+0

, так что не делайте никаких обратных ссылок, чтобы предотвратить явное удаление cpt_invoice? Благодарю. –

+0

Удалить удалить, вы должны знать, что делаете. Помните, что удаление записи cpt удаляет все зависимые записи cpt_invoice, что вы хотите защитить? –

+0

Я хочу поддерживать ссылочную целостность, не опасаясь записей cpt_invoice при использовании delete cpt; но я также хотел бы прекратить удаление cpt_invoice из-за того, что он предоставляет информацию родительской записи cpt. Если это имеет смысл (и это может быть совершенно смешно ..) –