PostgreSQL:如何实现最小基数?

use*_*616 10 sql postgresql cardinality

正如在这个问题中所回答的:PostgreSQL中的基数,基数是使用约束来实现的.

基数规则定义了允许的关系计数 - 一对多,多对多等.使用连接表实现多对多,使用FOREIGN KEY实现一对多.

但是如何实现一对一_或多(一对一+)关系.哪个是相同的问题:如何在PostgreSQL中强制执行最小基数?

实际情况是需要存储说明地址(或电话号码)的地址(或电话号码)必须由人(例如用户或客户)提供(但可以更多).

编辑:

上述情况是一个普遍问题的特殊情况(基数为1).一般问题是:如何强制执行任意数字的基数?

作为回答壶一个非空外键引用可以被用作一个替代解决方法,如果最小基数是一个.它还将提供一个额外的功能来选择许多默认值.

但考虑一下球队与其球员之间关系的另一种情况.每支球队必须拥有最少11名球员,才有资格成为一支球队.这里最小基数是十一(11).

类似的,学校的课程学生之间的关系,每个学生必须参加至少5门课程,每门课程必须有10名学生最少.

Ada*_*mKG 3

无法使用 CHECK 约束来指定这一点,所以我认为最好的方法是触发器:

http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html
http://www.postgresql.org/docs/9.1/static/plpgsql-trigger.html

你最终会得到类似的结果(我还没有测试过它或任何东西):

CREATE TRIGGER at_least_one before INSERT, UPDATE, DELETE ON the_one_table  FOR EACH ROW EXECUTE PROCEDURE check_at_least_one();

CREATE OR REPLACE FUNCTION check_at_least_one() RETURNS trigger AS $$
    BEGIN
    nmany := select count(*) from the_many_table where the_many_table.the_one_id=NEW.id;   
    IF nmany > 0 THEN 
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
Run Code Online (Sandbox Code Playgroud)