use*_*616 10 sql postgresql cardinality
正如在这个问题中所回答的:PostgreSQL中的基数,基数是使用约束来实现的.
基数规则定义了允许的关系计数 - 一对多,多对多等.使用连接表实现多对多,使用FOREIGN KEY实现一对多.
但是如何实现一对一_或多(一对一+)关系.哪个是相同的问题:如何在PostgreSQL中强制执行最小基数?
实际情况是需要存储说明地址(或电话号码)的地址(或电话号码)必须由人(例如用户或客户)提供(但可以更多).
编辑:
上述情况是一个普遍问题的特殊情况(基数为1).一般问题是:如何强制执行任意数字的基数?
作为回答壶一个非空外键引用可以被用作一个替代解决方法,如果最小基数是一个.它还将提供一个额外的功能来选择许多默认值.
但考虑一下板球队与其球员之间关系的另一种情况.每支球队必须拥有最少11名球员,才有资格成为一支球队.这里最小基数是十一(11).
类似的,学校的课程和学生之间的关系,每个学生必须参加至少5门课程,每门课程必须有10名学生最少.
无法使用 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)
| 归档时间: |
|
| 查看次数: |
4993 次 |
| 最近记录: |