Postgresql 무 거 운 함수 distinct 의 용법 설명

프로젝트 에서 우 리 는 데 이 터 를 재 처리 하고 가끔 in 이나 EXISTS 함 수 를 사용 합 니 다.아니면 group by 를 통 해서 도 검 사 를 할 수 있 습 니 다.
하지만 Postgresql 은 무 거 운 함수 도 가지 고 있 습 니 다:distinct
다음은 distinct 의 인 스 턴 스 입 니 다.
1.생 성 표:user

CREATE TABLE `user` (
 `name` varchar(30) DEFAULT NULL,
 `age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('  ', 20);
INSERT INTO `user` VALUES ('  ', 22);
INSERT INTO `user` VALUES ('  ', 20);
INSERT INTO `user` VALUES ('  ', 22);
INSERT INTO `user` VALUES ('  ', 20);
검색 결과:

SELECT * FROM user
   20
   22
   20
   22
   20
2.name 조회 에 따라 무 거 운 데 이 터 를 찾 습 니 다.

SELECT distinct name FROM user
  
  
3.name 과 age 조회 에 따라 무 거 운 데 이 터 를 찾 습 니 다.

SELECT distinct name,age FROM user
   20
   22
   20
   22
4.name,age 에 따라 중복 데이터 수 를 조회 합 니 다.

SELECT distinct name,age,count(*)      FROM user GROUP BY name,age
   20 2
   22 1
   20 1
   22 1
2.중복 데 이 터 를 찾 은 후에 중복 데 이 터 를 삭제 해 야 합 니 다.
중복 데 이 터 를 삭제 하 는 것 은 보통 몇 가지 방식 으로 임시 표 나 특정한 필드,예 를 들 어 id 등 을 사용 하여 max 또는 min 함 수 를 통 해 무 게 를 제거 합 니 다.
보충:post gresql ctid 기반 데이터 차이 동기 화
프로젝트 배경:
최근 에 이 구조 데이터 동기 화(비 실시 간)작업 을 하고 있 습 니 다.Oacle,gbase,postgresql 에서 my sql 데이터베이스 에 동기 화 되 었 습 니 다.자체 증가 필드(자체 증가 ID 또는 시간 필드)가 없 는 업무 표 에 대해 차이 점 을 동기 화 하 는 것 은 매우 번 거 로 운 일 입 니 다.주로 기록 의 추가,업데이트 와 삭제 에 나타 납 니 다.
비고:원본 라 이브 러 리 는 읽 기 전용 권한 을 가 진 사용자 만 제공 합 니 다.
ctid pg 에서 의 역할
ctid 는 자신 이나 신원 그룹 을 가리 키 는 원 그룹 식별 자 입 니 다.어떻게 이해 합 니까?다음은 몇 가지 실험 을 통 해 테스트 해 볼 수 있다.

satdb=# create table test_ctid(id int,name varchar(100));
satdb=# insert into test_ctid values(1,‘a'),(1,‘a');
satdb=# insert into test_ctid values(2,‘a'),(3,‘a');
기 록 된 ctid 값 보기

satdb=# select id,name,ctid from test_ctid;
id | name | ctid
----±-----±------
1 | a | (0,1)
1 | a | (0,2)
2 | a | (0,3)
3 | a | (0,4)
(4 rows)
id 2 기록 업데이트

satdb=# update test_ctid set name=‘b' where id=2;
UPDATE 1
여기 서 id=2 의 기록 이 새로운 원조 식별 자 를 가리 키 는 것 을 볼 수 있다(0,5)

satdb=# select id,name,ctid from test_ctid;
id | name | ctid
----±-----±------
1 | a | (0,1)
1 | a | (0,2)
3 | a | (0,4)
2 | b | (0,5)
(4 rows)
satdb=# select * from test_ctid where ctid='(0,1)';
id | name
----±-----
1 | a
(1 row)
id=3 의 기록 을 삭제 하면 해당 하 는 ctid(0,4)가 존재 하지 않 습 니 다.

satdb=# delete from test_ctid where id=3;
DELETE 1
satdb=# select *,ctid from test_ctid;
id | name | ctid
----±-----±------
1 | a | (0,1)
1 | a | (0,2)
2 | b | (0,5)
(3 rows)
기록 을 하나 더 삽입 할 때(0,4)이 식별 자 를 사용 할 수 있 는 지 확인 하 세 요.

satdb=# insert into test_ctid values(3,‘d');
INSERT 0 1
satdb=# select *,ctid from test_ctid;
id | name | ctid
----±-----±------
1 | a | (0,1)
1 | a | (0,2)
2 | b | (0,5)
3 | d | (0,6)
여기에 새로 삽 입 된 기록 은(0,4)을 사용 하지 않 고 새로운 식별 자(0,6)를 직접 분배 합 니 다.
요약:
1.ctid 의 역할 은 Oacle rowid 와 유사 하여 하나의 기록 을 표시 할 수 있 습 니 다.
2.기록 업데이트 후 새로운 ctid 생산
3.기록 삭제 후 새로 삽 입 된 기록 은 삭 제 된 기록 의 ctid 를 사용 하지 않 습 니 다.
4.ctid 를 바탕 으로 기록 의 재 작업 을 실현 할 수 있 습 니 다.
5.ctid 기반 으로 차이 증분 동기 화(추가,삭제,업데이트)를 실현 할 수 있 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기