테이블에 삽입 해야하는 많은 행이 있지만 이러한 삽입은 항상 일괄 처리로 수행됩니다. 그래서 배치의 단일 행이 테이블에 존재하는지 확인하고 싶습니다.
따라서 기본 키 검사는 아니지만 너무 중요하지는 않습니다. 단일 행만 확인하고 싶을 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;