如何使用级联删除与限制一对一记录关系的参照完整性?
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,
..... )
到目前为止一切顺利。现在执行以下约束的最佳方法是什么:
- 如果 cpt 中的任何记录引用了 cpt_invoice 中的记录,则无法删除它,并且
- 如果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 功能,你可以限制用户进行某些操作。
我有一个 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,
..... )
到目前为止一切顺利。现在执行以下约束的最佳方法是什么:
- 如果 cpt 中的任何记录引用了 cpt_invoice 中的记录,则无法删除它,并且
- 如果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 功能,你可以限制用户进行某些操作。