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

前端之家收集整理的这篇文章主要介绍了如何编写postgresql中最大行数约束?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为这是一个很常见的问题。

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

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

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

谢谢!

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

以下是代码

  1. CREATE OR REPLACE FUNCTION enforce_photo_count() RETURNS trigger AS $$
  2. DECLARE
  3. max_photo_count INTEGER := 10;
  4. photo_count INTEGER := 0;
  5. must_check BOOLEAN := false;
  6. BEGIN
  7. IF TG_OP = 'INSERT' THEN
  8. must_check := true;
  9. END IF;
  10.  
  11. IF TG_OP = 'UPDATE' THEN
  12. IF (NEW.owner != OLD.owner) THEN
  13. must_check := true;
  14. END IF;
  15. END IF;
  16.  
  17. IF must_check THEN
  18. -- prevent concurrent inserts from multiple transactions
  19. LOCK TABLE photos IN EXCLUSIVE MODE;
  20.  
  21. SELECT INTO photo_count COUNT(*)
  22. FROM photos
  23. WHERE owner = NEW.owner;
  24.  
  25. IF photo_count >= max_photo_count THEN
  26. RAISE EXCEPTION 'Cannot insert more than % photos for each user.',max_photo_count;
  27. END IF;
  28. END IF;
  29.  
  30. RETURN NEW;
  31. END;
  32. $$ LANGUAGE plpgsql;
  33.  
  34.  
  35. CREATE TRIGGER enforce_photo_count
  36. BEFORE INSERT OR UPDATE ON photos
  37. FOR EACH ROW EXECUTE PROCEDURE enforce_photo_count();

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

猜你在找的Postgre SQL相关文章