[sql] PostgreSQL에 행이 존재하는지 확인

테이블에 삽입 해야하는 많은 행이 있지만 이러한 삽입은 항상 일괄 처리로 수행됩니다. 그래서 배치의 단일 행이 테이블에 존재하는지 확인하고 싶습니다.

따라서 기본 키 검사는 아니지만 너무 중요하지는 않습니다. 단일 행만 확인하고 싶을 count(*)수도 있으므로 아마 좋지 않습니다 exists.

그러나 PostgreSQL을 처음 접했기 때문에 알고있는 사람들에게 물어보십시오.

내 배치에는 다음 구조의 행이 있습니다.

userid | rightid | remaining_count

따라서 테이블에 제공된 행이 있으면 모두 행이 userid있음을 의미합니다.



답변

TRUE / FALSE 리턴에 EXISTS 키워드를 사용하십시오.

select exists(select 1 from contact where id=12)


답변

어떻습니까?

select 1 from tbl where userid = 123 limit 1;

123삽입하려는 배치의 사용자 ID는 어디에 있습니까 ?

위의 쿼리는 주어진 사용자 ID를 가진 레코드가 있는지에 따라 빈 세트 또는 단일 행을 반환합니다.

이 속도가 너무 느리면에 색인을 생성 할 수 tbl.userid있습니다.

배치의 단일 행조차도 테이블에 존재하면이 경우 행이 모두 삽입되었는지 확인하기 때문에 행을 삽입 할 필요가 없습니다.

프로그램이 배치 중간에 중단 되더라도이 상태를 유지하려면 데이터베이스 트랜잭션을 적절하게 관리해야합니다 (예 : 전체 배치가 단일 트랜잭션 내에 삽입 됨).


답변

INSERT INTO target( userid, rightid, count )
  SELECT userid, rightid, count
  FROM batch
  WHERE NOT EXISTS (
    SELECT * FROM target t2, batch b2
    WHERE t2.userid = b2.userid
    -- ... other keyfields ...
    )
    ;

BTW : 중복으로 인해 전체 배치가 실패하려면 (기본 키 제약 조건이 부여됨)

INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count
FROM batch
    ;

당신이 원하는 것을 정확하게 할 것입니다 : 성공하거나 실패합니다.


답변

select true from tablename where condition limit 1;

이것이 postgres가 외래 키를 확인하는 데 사용하는 쿼리라고 생각합니다.

귀하의 경우에는 한 번 에이 작업을 수행 할 수도 있습니다.

insert into yourtable select $userid, $rightid, $count where not (select true from yourtable where userid = $userid limit 1);


답변

@MikeM이 지적했듯이.

select exists(select 1 from contact where id=12)

인덱스 접촉에, 보통 1 MS에 시간 비용을 줄일 수 있습니다.

CREATE INDEX index_contact on contact(id);


답변

SELECT 1 FROM user_right where userid = ? LIMIT 1

결과 집합에 행이 포함되어 있으면 삽입 할 필요가 없습니다. 그렇지 않으면 기록을 삽입하십시오.


답변

performace에 대해 생각하면 다음과 같이 함수에서 “PERFORM”을 사용할 수 있습니다.

 PERFORM 1 FROM skytf.test_2 WHERE id=i LIMIT 1;
  IF FOUND THEN
      RAISE NOTICE ' found record id=%', i;
  ELSE
      RAISE NOTICE ' not found record id=%', i;
 END IF;