database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7071 게시물 읽기
No. 7071
쿼리 질문입니다.
작성자
조진우(열혈지누)
작성일
2007-03-06 14:46
조회수
4,576

 6770666 | uid123 | 2007-01-19 16:22:37.268789 |  10000 |       0 |   51

 5158288 | uid123 | 2006-03-03 15:23:01.587067 | 104000 |   5000|   11


id|uid|date|amount|balance|type

이런식에 자료가 있습니다.


현재 51 번에 balance가 잘못 들어 가있어서 그값을 업데이트 해야 합니다.


6770666에 balance에 값은 6770666에 amount + 5158288 에 balance가 되어야 하는데여


제가 생각한 쿼리는 


update cash_tx set balance = amount + (select balance from cash_tx where date < (select date from cash_tx where uid='uid123' and type=51 ) and uid='uid123' order by date desc limit 1) where uid='uid123' and type =51;


이런식에 쿼리를 만들었습니다. 보기에도 좀 이상하고 뭔가 매칭이 제대로 안돼는거 같습니다.


심플한 방법이나 아님 이전 값을 자동으로 가져오는 것이 있으면 알려주세요 부탁드립니다.


이 글에 대한 댓글이 총 1건 있습니다.

통장 자료를 만드려고 하는 것 같은데요, 

그 방식은 일반적으로 트랜잭션 + 테이블 잠금 + 트리거 로 풀어가는 것이 정석입니다.

1. 트랜잭션을 시작하고, 
2. 테이블을 잠그고,
3. insert 구문을 실행하고,
4. 트랜잭션 마치고.

insert 구문을 수행하는 테이블에 befor for each row trigger를 걸어둡니다. 

그 트리거에서 수행하는 트리거 함수는 단순하게, 
해당 사용자의 마지막 balance 값을 구해서, 
새로 입력될 balance 값을 재조정해서 insert 작업으로 넘겨줍니다.

잘 풀어보세요. 

단순히 단일 쿼리로 풀어가다보면, 트랜잭션 이론에서 이야기하는 
전혀 예상치 못하는 결과를 만들어냅니다.

김상기(ioseph)님이 2007-03-06 17:16에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7074날짜 조건 포함에 따른 속도 저하.. [2]
소심고양이
2007-03-12
5894
7073[급함]다시한번 질문 드립니다. [1]
나그네
2007-03-10
4137
7072잔액 계산을 하는 쿼리 질문입니다. [1]
가우나라
2007-03-06
4474
7071쿼리 질문입니다. [1]
조진우
2007-03-06
4576
7070PostgresSQL 7.3 -> 8.2.3 업그레이드 시 encoding error [1]
무적초보
2007-03-05
7380
7069트리거는 어떻게 해야하는지.. [1]
스치는인연
2007-03-02
4516
7067해당 필드에 유니코드데이타가 들어있는지 아는 방법? [5]
dba
2007-02-28
5586
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다