如何使用级联删除与限制一对一记录关系的参照完整性?

How to use cascade delete vs restrict for referential integrity with one-to-one record relationships?

我有一个 table CPT 定义为

   TABLE cpt
(
   recid serial NOT NULL,
   ccpt text,
   cdesc text NOT NULL,
   ninsurance numeric(10,2),
   ncash numeric(10,2),
  ..... )

其中我希望将值 nsurance 和 ncash 移动到 cpt table 中的另一条记录。因此,我将这些值移动到另一个定义为

的table、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,
  ..... )

减少 cpt table 到:

   TABLE cpt
(
   recid serial NOT NULL,
   ccpt text,
   cdesc text NOT NULL,
  ..... )

到目前为止一切顺利。现在执行以下约束的最佳方法是什么:

  1. 如果 cpt 中的任何记录引用了 cpt_invoice 中的记录,则无法删除它,并且
  2. 如果cpt中的一条记录被删除,那么cpt_invoice中引用的记录也会被删除。

注意:这些 table 是一对一的,这意味着 cpt 中的每条记录在 cpt_invoice 中只有一条记录,反之亦然。

唯一想到的就是把cpt_invoice的主键加到cpt上table然后在cpt上table做

REFERENCES cpt_invoice (recid) ON DELETE RESTRICT

使用 back-link 有意义吗?其他人是怎么做到的?

TIA

我会这样写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 功能,你可以限制用户进行某些操作。