加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何编写postgresql中最大行数约束?

发布时间:2020-12-13 16:36:26 所属栏目:百科 来源:网络整理
导读:我认为这是一个很常见的问题。 我有一个表用户(ID INT …)和一张表照片(id BIGINT,所有者INT)。所有者是用户(id)的参考。 我想为表格照片添加一个约束,这将阻止超过让我们说10张照片为每个用户输入数据库。 写这个的最好方法是什么? 谢谢! Quassnoi是对
我认为这是一个很常见的问题。

我有一个表用户(ID INT …)和一张表照片(id BIGINT,所有者INT)。所有者是用户(id)的参考。

我想为表格照片添加一个约束,这将阻止超过让我们说10张照片为每个用户输入数据库。

写这个的最好方法是什么?

谢谢!

Quassnoi是对的触发器将是实现此目标的最佳方式。

以下是代码:

CREATE OR REPLACE FUNCTION enforce_photo_count() RETURNS trigger AS $$
DECLARE
    max_photo_count INTEGER := 10;
    photo_count INTEGER := 0;
    must_check BOOLEAN := false;
BEGIN
    IF TG_OP = 'INSERT' THEN
        must_check := true;
    END IF;

    IF TG_OP = 'UPDATE' THEN
        IF (NEW.owner != OLD.owner) THEN
            must_check := true;
        END IF;
    END IF;

    IF must_check THEN
        -- prevent concurrent inserts from multiple transactions
        LOCK TABLE photos IN EXCLUSIVE MODE;

        SELECT INTO photo_count COUNT(*) 
        FROM photos 
        WHERE owner = NEW.owner;

        IF photo_count >= max_photo_count THEN
            RAISE EXCEPTION 'Cannot insert more than % photos for each user.',max_photo_count;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER enforce_photo_count 
    BEFORE INSERT OR UPDATE ON photos
    FOR EACH ROW EXECUTE PROCEDURE enforce_photo_count();

我包括表锁定,以避免两个并发的篡改对用户计数照片的情况,看到当前的计数是低于限制的1,然后两者都插入,这将导致你超过限制。如果这不是您的问题,最好删除锁定,因为它可能成为许多插入/更新的瓶颈。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读