복붙노트

[SQL] 어떻게 PostgreSQL의 행의 최대 수에 관한 제약 조건을 작성하는?

SQL

어떻게 PostgreSQL의 행의 최대 수에 관한 제약 조건을 작성하는?

나는 이것이 매우 일반적인 문제라고 생각합니다.

나는 테이블 사용자 (아이디 INT ...)와 테이블 사진 (ID BIGINT, 오너 INT)를 가지고있다. 소유자는 사용자 (ID)에 대한 기준이다.

나는 각 사용자에 대한 데이터베이스를 입력하자의 말보다 더 많은 10 개 사진을 방지 할 테이블의 사진에 제약 조건을 추가하고 싶습니다.

이 글을 쓰는 가장 좋은 방법은 무엇입니까?

고마워!

해결법

  1. ==============================

    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. ==============================

    2.당신은 테이블 선언에서 이러한 제약 조건을 쓸 수 없습니다.

    당신은 테이블 선언에서 이러한 제약 조건을 쓸 수 없습니다.

    몇 가지 해결 방법이 있습니다 :

  3. ==============================

    3.한 가지 다른 방법은 사진의 최대 수를 적용 할에 사용자 테이블에 열 "PHOTO_COUNT"를 추가 그것은 현실을 반영하기 위해 트리거로 업데이트 및 검사를 추가하는 것입니다.

    한 가지 다른 방법은 사진의 최대 수를 적용 할에 사용자 테이블에 열 "PHOTO_COUNT"를 추가 그것은 현실을 반영하기 위해 트리거로 업데이트 및 검사를 추가하는 것입니다.

    이에서 사이드 장점은 주어진 순간에 우리는 많은 사진을 사용자가 얼마나 (계산없이) 알고 있다는 것입니다.

    반면에 - 그것은 당신에게 원하는 것이 경우에 사용자의 사진을 다시 정렬 할 수있는 기능을 제공으로 Quassnoi이 제안 된 접근 방식은 정말 멋진이기도합니다.

  4. ==============================

    4.더 나은 대안은 삽입을 할 때 행의 수를 확인하는 것입니다 :

    더 나은 대안은 삽입을 할 때 행의 수를 확인하는 것입니다 :

    insert into photos(id,owner) 
    select 1,2 from dual
    where (select count(*) from photos where id=1) < 10
    
  5. 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