如何在postgreSQL

时间:2016-03-19 10:23:56

标签: sql postgresql constraints

我正在为计算机商店设置数据库。在数据库中,我有一个名为computer_system的表,它有一个数组属性。在数组中,这些组件是: 中央处理器 内存 案件 主板 显卡

现在到了棘手的部分: 不同的组件有自己的表,并且都是名为component的表的子表。 主板表有一个名为"板载图形的属性"。如果它有图形卡,它将在此处列出。如果不是,则该属性为null。

现在,当我在computer_system表中插入组件时,我需要postgres来检查主板是否通过,有一个on_board图形卡。如果没有,则必须先添加图形卡,然后才能成功执行查询。如何添加此约束?

我试图尽我所能解释我的问题,而且我检查了所有的书,但我找不到答案。如果有什么不清楚的话,请随时问我。 此外,这是我为此数据库制作的未完成的ER图

http://i.stack.imgur.com/zAT0f.png

编辑: 换句话说,我想要做的是,如果mainboard.on_board_graphics为NULL,那么graphics_card不能为NULL。

1 个答案:

答案 0 :(得分:1)

显而易见的方法是执行CHECK约束,这不允许graphics_card和on_board_graphics同时为null。但是on_board_graphics在另一个表中,并且由于postgresql不允许在CHECK中使用子查询,所以这不是解决方案。

我通过添加一个函数和一个触发器解决了这个问题:

CREATE FUNCTION graphics_guaranteed() RETURNS TRIGGER AS $$ 
BEGIN

IF 
(SELECT on_board FROM mainboard WHERE NEW.mainboard = mainboard.name) IS NULL
AND
NEW.graphics_card IS NULL
THEN
RAISE EXCEPTION 'graphics not found';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER graphics_trigger
AFTER UPDATE OR INSERT ON computer_system
FOR EACH ROW
EXECUTE PROCEDURE graphics_guaranteed();

希望这有帮助,如果其他人偶然发现同样的问题。