是否可以将视图中的列称为外键(PostgreSQL 9.4)?

是否可以将视图中的列称为外键(PostgreSQL 9.4)?,第1张

概述我知道在旧版本中它是不可能的,是否与版本9.4相同? 我正在尝试做这样的事情: CREATE VIEW products AS SELECT d1.id AS id, d1.price AS pr FROM dup.freshProducts AS d1 UNION SELECT d2.id AS id, d2.price AS pr FROM dup.cannedPro 我知道在旧版本中它是不可能的,是否与版本9.4相同?

我正在尝试做这样的事情:

CREATE VIEW products AS     SELECT d1.ID AS ID,d1.price AS pr FROM dup.freshProducts AS d1    UNION    SELECT d2.ID AS ID,d2.price AS pr FROM dup.cannedProducts AS d2;CREATE table orderlines(     line_ID integer PRIMARY KEY,product_no integer REFERENCES productVIEw.ID);

我正在尝试实现一个继承关系,其中freshProducts和cannedProducts都从产品继承.我使用两个不同的表实现了它,并创建了一个只包含freshProducts和cannedProducts之间共同属性的视图产品.此外,orderlines中的每一行都与产品(freshProduct或cannedProduct)有关系.请参阅图像以获得澄清.

如果还不能引用视图,您认为哪种解决方案最好?我曾想过使用触发器实现物化视图或实现限制.您能否建议使用此类触发器作为基础的任何好例子?

非常感谢你!

引用(物化)视图不起作用,触发器可能如下所示:
CREATE OR REPLACE FUNCTION reject_not_existing_ID()    RETURNS "trigger" AS    $BODY$        BEGIN            IF NEW.product_no NOT IN (SELECT ID FROM dup.freshProducts UNION SELECT ID FROM dup.cannedProducts) THEN                RAISE EXCEPTION 'The product ID % does not exist',NEW.product_no;            END IF;            RETURN NEW;        END;    $BODY$        LANGUAGE 'plpgsql' VolATILE;CREATE TRIGGER tr_before_insert_or_update    BEFORE INSERT OR UPDATE OF product_no    ON orderlines    FOR EACH ROW    EXECUTE PROCEDURE reject_not_existing_ID();

(另见http://www.tek-tips.com/viewthread.cfm?qid=1116256)

物化视图可能看起来像一个好方法,但失败有两个原因:像一个视图你根本无法引用它,因为它不是表(继续尝试).假设你可以,仍然存在在freshProducts和cannedProducts中阻止两个相同ID的问题.是的,您可以在物化视图上定义UNIQUE INDEX,但是如何确保在新的罐头中不使用相同的ID?
如果在orderlines中使用触发器,那么您仍需要解决这个问题.

这让我建议重新考虑你的模型. ‘Fresh’和’canned’也可能是单个表产品属性的值,因此使所有麻烦变得多余.如果新鲜和罐装产品的属性(数量)显着不同(不能想到创建两个不同表的任何其他原因),那么在另外两个表中引用产品ID.喜欢

CREATE table products(    ID ... PRIMARY KEY,fresh_or_canned ...,price ...,another_common_attribute_1 ...,...,another_common_attribute_n ...);CREATE table canned_specific_data(    canned_ID ... REFERENCES products (ID),type_of_can ...,another_attribute_that_does_not_apply_to_fresh ...);CREATE table fresh_specific_data(    fresh_ID ... REFERENCES products (ID),date_of_harvest ...,another_attribute_that_does_not_apply_to_canned ...);
总结

以上是内存溢出为你收集整理的是否可以将视图中的列称为外键(PostgreSQL 9.4)?全部内容,希望文章能够帮你解决是否可以将视图中的列称为外键(PostgreSQL 9.4)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1170110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存