gpt4 book ai didi

sql - PostgreSQL:如何实现最小基数?

转载 作者:行者123 更新时间:2023-11-29 11:16:11 24 4
gpt4 key购买 nike

正如在这个问题中的回答:Cardinality in PostgreSQL , 基数是使用 constraints 强制执行的.

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

但是如何实现一对一或多(一对一+)关系。这与提问相同:如何在 PostgreSQL 中实现最小基数?

实际情况是需要存储地址(或电话号码),而地址(或电话号码)必须由个人(例如用户或客户)提供(但可以多于一个)。

编辑:

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

作为answered by jug如果 minimum-cardinality 为 1,则 non-null FOREIGN KEY 引用可用作变通方法。它还将提供一个额外的功能来选择默认值。

但考虑另一种情况,即Cricket团队之间的关系| 及其玩家。每支球队必须至少有 11 名球员才能成为一支球队。这里的最小基数是十一 (11)。

类似地,类(class)和学校中的学生之间的关系,每个学生必须注册至少 5 门类(class),并且每门类(class)必须至少有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;

关于sql - PostgreSQL:如何实现最小基数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com