자바 프로 그래 밍 기록 - 데이터베이스 & SQL (충전 중...)
4284 단어 Java데이터베이스 & SQL
자바 프로 그래 밍 기록 - 공구 상자 (충전 중...) 글 에서 분 리 된 모듈.이 모듈 은 뒤에서 찾 아 볼 수 있 도록 평소에 발생 하 는 sql 방면 의 문 제 를 기록 합 니 다.다음은 문제 의 장면 에 따라 분류 한다.
랜 덤 페이지
문제 장면
현재 표 에서 정량 (1000 개의 데 이 터 를 가정) 의 데 이 터 를 조회 해 야 하 며, 일부 데 이 터 는 어떤 문제 로 처리 할 수 없 지만 폐기 할 수 없 기 때문에 처리 할 때 continue 건 너 뛰 기 를 합 니 다.그러나 이 부분 에서 처리 할 수 없 는 데이터 가 1000 개 에 이 르 면 처 리 를 담당 하 는 스 레 드 는 공전 상태 에 들 어가 유용 한 데 이 터 를 처리 하지 않 는 다.
계획
무 작위 로 페이지 를 찾 는 방식 을 이용 하 다.
private List selectPersonInfo(int limit){
Random r = new Random();
int sum = dao.queryMessageCountByStatus("user_info", 0);
//page=0~9
int page = sum%limit==0?r.nextInt(sum/limit):r.nextInt((sum/limit)+1);
return dao.getPersonInfo(page*limit, limit); // 0
}
mysql:
select * from user_info where status=0 order by insert_time desc limit index,limit;
주의해 야 할 것 은 매개 변수의 의미 이다. 예 를 들 어 'limit 1, 2' 는 두 번 째 기록 부터 2 개 를 뒤로 가 져 가 는 것 을 나타 낸다.
oracle:
select * from (
select rownum rn, mi.* from (
select * from (
select * from user_info where status=0 order by insert_time desc
) where rownum <= (index+limit)
) mi
) where rn >= (index+1);
Oacle 은 좀 특수 합 니 다. 이렇게 써 야 합 니 다. (정렬 한 다음 에 최대 치 를 찾 고 최소 치 를 찾 습 니 다) 그리고 rownum 은 1 부터 시작 하기 때문에 최소 치 는 + 1 이 필요 합 니 다.
sqlserver:
select top limit * from user_info where primary_key not in (
select top index primary_key from user_info order by insert_time desc
) and status=0 order by insert_time desc;
sqlserver 는 먼저 제거 한 다음 정렬 하여 선택 합 니 다.
sqlserver 페이지 정렬 참조 링크
모든 테이블, 시퀀스, 저장 프로 세 스 삭제
----
select 'drop table ' || table_name ||';'||chr(13)||chr(10) from user_tables;
----
select 'drop sequence ' || sequence_name||';'||chr(13)||chr(10) from user_sequences;
----
select 'drop procedure ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='PROCEDURE';
실행 이 완료 되면 삭제 문 구 를 생 성하 고 복사 하여 실행 하면 됩 니 다 (저장 과정의 현재 사용 되 지 않 음).
삽입 또는 업데이트 실현
삽입 또는 업 데 이 트 를 실현 합 니 다. 이 키 가 있 으 면 업데이트 하고 없 으 면 삽입 합 니 다.
mysql:
insert ignore into ( 1, 2,...) values(?,?,...) on duplicate key update count = count + ?, time = now();
update 뒤에 업데이트 할 필드 를 직접 따라 가면 됩 니 다.
oracle:
merge into using dual on ( ( : =?))
when matched then update set 1= 1, ...
when no matched then insert( 1, 2, ...)
values(?, ?, ...);
예 를 들 어 설명:
merge into user_info ui using dual on (ui.id = ?)
when matched then update set status=?
when no matched then insert(id, name, age, status)
values(?, ?, ?, ?);
테스트 효율 설명 (14 개 필드, 일괄 처리 사용):
삼목 연산 (유사)
장면
예 를 들 어 나 는 특정한 표 데이터 가 이 상태 에서 업 데 이 트 된 횟수 (가설 일 뿐) 를 통계 하고 싶다.매번 업데이트 할 때 업데이트 할 데이터 의 상태 가 표 의 상태 와 같 는 지 판단 하고 같 으 면 누적 되 며 그렇지 않 으 면 1 로 초기 화 합 니 다.
계획
mysql:
update_count = if(status = ?, update_count + ?, 1)
oracle:
update_count = decode(status, ?, update_count + ?, 1)
navicat 에서 테스트 명령 실행:
select decode('1', '2', 'y', 'n') from dual; --- n
select decode('1', '1', 'y', 'n') from dual; --- y
select decode(1, 2, 'y', 'n') from dual; --- n
select decode(1, 1, 'y', 'n') from dual; --- y
select decode(1, '1' 'y', 'n') from dual; --- y
같은 유형의 경우 에 사용 할 수 있 음 을 알 수 있다.
형식 대응:
decode( , 1, 1, 2, 2, )
if = 1
1
else if = 2
2
else
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.