[SQL] 어떻게 PostgreSQL의 행의 최대 수에 관한 제약 조건을 작성하는?
SQL어떻게 PostgreSQL의 행의 최대 수에 관한 제약 조건을 작성하는?
나는 이것이 매우 일반적인 문제라고 생각합니다.
나는 테이블 사용자 (아이디 INT ...)와 테이블 사진 (ID BIGINT, 오너 INT)를 가지고있다. 소유자는 사용자 (ID)에 대한 기준이다.
나는 각 사용자에 대한 데이터베이스를 입력하자의 말보다 더 많은 10 개 사진을 방지 할 테이블의 사진에 제약 조건을 추가하고 싶습니다.
이 글을 쓰는 가장 좋은 방법은 무엇입니까?
고마워!
해결법
-
==============================
1.Quassnoi은 맞다; 트리거는이를 달성하는 가장 좋은 방법이 될 것입니다.
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();
나는 두 개의 동시 tansactions는 사용자의 사진을 계산 것 피하기 상황을 위해, 현재의 카운트가 한계 이하로 한 것을 볼, 다음을 일으킬 것 모두 삽입, 한도를 초과 한 갈 테이블 잠금을 포함. 그런 당신을 위해 문제가 아니라면 그것은 많은 삽입 / 업데이트 병목 현상이 수 잠금을 제거하는 가장 좋은 것입니다.
-
==============================
2.당신은 테이블 선언에서 이러한 제약 조건을 쓸 수 없습니다.
당신은 테이블 선언에서 이러한 제약 조건을 쓸 수 없습니다.
몇 가지 해결 방법이 있습니다 :
-
==============================
3.한 가지 다른 방법은 사진의 최대 수를 적용 할에 사용자 테이블에 열 "PHOTO_COUNT"를 추가 그것은 현실을 반영하기 위해 트리거로 업데이트 및 검사를 추가하는 것입니다.
한 가지 다른 방법은 사진의 최대 수를 적용 할에 사용자 테이블에 열 "PHOTO_COUNT"를 추가 그것은 현실을 반영하기 위해 트리거로 업데이트 및 검사를 추가하는 것입니다.
이에서 사이드 장점은 주어진 순간에 우리는 많은 사진을 사용자가 얼마나 (계산없이) 알고 있다는 것입니다.
반면에 - 그것은 당신에게 원하는 것이 경우에 사용자의 사진을 다시 정렬 할 수있는 기능을 제공으로 Quassnoi이 제안 된 접근 방식은 정말 멋진이기도합니다.
-
==============================
4.더 나은 대안은 삽입을 할 때 행의 수를 확인하는 것입니다 :
더 나은 대안은 삽입을 할 때 행의 수를 확인하는 것입니다 :
insert into photos(id,owner) select 1,2 from dual where (select count(*) from photos where id=1) < 10
from https://stackoverflow.com/questions/1743439/how-to-write-a-constraint-concerning-a-max-number-of-rows-in-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 액세스 테이블이 존재하는지 확인 (0) | 2020.05.14 |
---|---|
[SQL] IN의 배열 () 절 오라클 PLSQL (0) | 2020.05.14 |
[SQL] SQL을 사용하여 날짜 범위를 생성 (0) | 2020.05.14 |
[SQL] 왜 우리는 GROUP BY 집계 함수에 필요합니까? (0) | 2020.05.14 |
[SQL] 외부 키로서 복합 키 (SQL) (0) | 2020.05.14 |