您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何确保无关表之间的完整性?

如何确保无关表之间的完整性?

您可以使用受控冗余和复合FK约束来做到这一点:

CREATE TABLE offr (
    offr_id INT NOT NULL,
    coy_id INT NOT NULL,
    PRIMARY KEY (offr_id),
    FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id),
    UNIQUE KEY (offr_id, coy_id)
);

添加一个复合唯一键(offr_id,coy_id)来支持subscribe表上的复合FK约束。

CREATE TABLE provide (
    coy_id INT NOT NULL,
    type_id INT NOT NULL,
    PRIMARY KEY (coy_id, type_id),
    FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id)
);

这里的复合主键非常适合subscribe表上的复合FK约束。

CREATE TABLE subscribe (
    naf_no INT NOT NULL,
    coy_id INT NOT NULL,
    type_id INT NOT NULL,
    PRIMARY KEY (naf_no, type_id),
    FOREIGN KEY (naf_no, coy_id) REFERENCES offr (offr_id, coy_id),
    FOREIGN KEY (coy_id, type_id) REFERENCES provide (coy_id, type_id)
);

重叠的复合FK约束将确保官员只能订阅他/她注册的公司提供的保险。coy_id从逻辑上讲是冗余的,但对于完整性而言是必需的,并且不会因FK约束而存在更新异常的风险。

或者,您可以使用触发器来检查值是否通过内部联接相关:

CREATE TRIGGER check_subscribe BEFORE INSERT OR UPDATE ON subscribe
FOR EACH ROW
WHEN NOT EXISTS (
    SELECT 1
    FROM offr
    INNER JOIN provide ON offr.coy_id = provide.coy_id
    WHERE offr.offr_id = new.naf_no AND provide.type_id = new.type_id
)
RAISE_APPLICATION_ERROR (num => -20000, msg => 'Officers can only subscribe to types provided by their company');

免责声明:我无法在sqlfiddle上进行测试,也没有安装Oracle,但希望它将为您指明正确的方向。

其他 2022/1/1 18:44:24 有434人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶