:meta-keywords: cubrid incr, cubrid decr :meta-description: The **INCR** and **DECR** functions are called "click counters" and can be effectively used to quickly update a counter. :tocdepth: 3 **************** í´ë¦ ì¹´ìš´í„° 함수 **************** .. contents:: INCR, DECR ========== .. function:: INCR (column) .. function:: DECR (column) **INCR** 함수는 **SELECT** ì ˆì— í¬í•¨ë˜ì–´ ì¸ìžë¡œ 주어진 ì¹¼ëŸ¼ì˜ ê°’ì„ 1 ì¦ê°€ì‹œì¼œ 주는 ê¸°ëŠ¥ì„ í•œë‹¤. **DECR** 함수는 해당 ì¹¼ëŸ¼ì˜ ê°’ì„ 1 ê°ì†Œì‹œí‚¨ë‹¤. :param column: SMALLINT, INT ë˜ëŠ” BIGINT íƒ€ìž…ì˜ ì¹¼ëŸ¼ ì´ë¦„ :rtype: SMALLINT, INT ë˜ëŠ” BIGINT **INCR** 함수와 **DECR** 함수는 'í´ë¦ ì¹´ìš´í„°' 함수로 불리며, ê²Œì‹œíŒ ìœ í˜•ì˜ ì›¹ 서비스ì—서 ê²Œì‹œë¬¼ì˜ ì¡°íšŒìˆ˜ë¥¼ ì¦ê°€ì‹œí‚¤ëŠ”ë° ìœ ìš©í•˜ê²Œ 사용ë 수 있다. ê²Œì‹œë¬¼ì˜ ë‚´ìš©ì„ **SELECT** í•˜ê³ ê³§ë°”ë¡œ ê²Œì‹œë¬¼ì˜ ì¡°íšŒìˆ˜ë¥¼ **UPDATE** 로 1 ì¦ê°€í•˜ëŠ” ìœ í˜•ì˜ ì‹œë‚˜ë¦¬ì˜¤ì—서 í•˜ë‚˜ì˜ **SELECT** ë¬¸ì— **INCR** 함수를 ì‚¬ìš©í•¨ìœ¼ë¡œì¨ í•œ ë²ˆì— ê²Œì‹œë¬¼ ë‚´ìš© 조회와 조회수 ì¦ê°€ ìž‘ì—…ì„ ìˆ˜í–‰í• ìˆ˜ 있다. **INCR** 함수는 ì¸ìžë¡œ ëª…ì‹œëœ ì¹¼ëŸ¼ ê°’ì„ ì¦ê°€ì‹œí‚¨ë‹¤. 단, ì¸ìžë¡œëŠ” ì •ìˆ˜ íƒ€ìž…ì˜ ìˆ«ìží˜•ë§Œ 올 수 ìžˆê³ , ê°’ì´ **NULL** ì¸ ê²½ìš° **INCR** 함수를 ìˆ˜í–‰í•˜ì—¬ë„ ê°’ì€ **NULL** ì„ ìœ ì§€í•œë‹¤. 즉, ê°’ì´ ì„¤ì •ë˜ì–´ì•¼ **INCR** 함수를 ì¨ì„œ ê°’ì„ ì¦ê°€ì‹œí‚¬ 수 있다. **DECR** 함수는 ì¸ìžë¡œ ëª…ì‹œëœ ì¹¼ëŸ¼ ê°’ì„ ê°ì†Œì‹œí‚¨ë‹¤. **SELECT** ì ˆì— **INCR** 함수를 명시한 경우, ì¹´ìš´í„° ê°’ì€ 1ì´ ì¦ê°€í•˜ê³ ì§ˆì˜ ê²°ê³¼ëŠ” ì¦ê°€í•˜ê¸° ì „ì˜ ê°’ìœ¼ë¡œ ì¶œë ¥í•œë‹¤. ê·¸ë¦¬ê³ , **INCR** 함수는 ì§ˆì˜ ì²˜ë¦¬ ê³¼ì •ì—서 참여한 í–‰(tuple)ì´ ì•„ë‹ˆë¼ ìµœì¢… ê²°ê³¼ì— ì°¸ì—¬í•œ í–‰ì— ëŒ€í•´ì„œë§Œ ê°’ì„ ì¦ê°€ì‹œí‚¨ë‹¤. **SELECT** ë¦¬ìŠ¤íŠ¸ì— **INCR** ë˜ëŠ” **DECR** 함수를 명시하지 ì•Šê³ í´ë¦ 카운터를 ì¦ê°€ ë˜ëŠ” ê°ì†Œì‹œí‚¤ê³ ìž í•˜ëŠ” 경우, WHERE ì ˆ ë’¤ì— **WITH INCREMENT FOR** *column* ë˜ëŠ” **WITH INCREMENT FOR** *column* ì„ ëª…ì‹œí•˜ë©´ ëœë‹¤. .. code-block:: sql CREATE TABLE board (id INT, cnt INT, content VARCHAR(8096)); SELECT content FROM board WHERE id=1 WITH INCREMENT FOR cnt; .. note:: * **INCR/DECR** 함수는 ì‚¬ìš©ìž ì •ì˜ íŠ¸ëžœìžì…˜ê³¼ 별ë„로 시스템 ë‚´ë¶€ì—서 사용ë˜ëŠ” top operationì´ ì ìš©ë˜ì–´ 트랜ìžì…˜ì˜ **COMMIT/ROLLBACK** ê³¼ ìƒê´€ì—†ì´ ë°ì´í„°ë² ì´ìŠ¤ì— ìžë™ìœ¼ë¡œ ì ìš©ëœë‹¤. * í•˜ë‚˜ì˜ **SELECT** ë¬¸ì— **INCR/DECR** 함수를 여러 ê°œ ì‚¬ìš©í• ê²½ìš°, 해당 ì§ˆì˜ ë‚´ì˜ ê°ê°ì˜ **INCR/DECR** 함수 중 하나ë¼ë„ 실패하면 ëª¨ë‘ ì‹¤íŒ¨í•œë‹¤. * **INCR/DECR** 함수는 최ìƒìœ„ **SELECT** 문ì—ë§Œ ì ìš©ëœë‹¤. **INSERT** ... **SELECT** ... 구문과 **UPDATE** table **SET** col = **SELECT** ... 등과 ê°™ì€ **SUB SELECT** ë¬¸ì€ ì§€ì›í•˜ì§€ 않는다. 다ìŒì€ **INCR** 함수가 허용ë˜ì§€ 않는 예ì´ë‹¤. .. code-block:: sql SELECT b.content, INCR(b.read_count) FROM (SELECT * FROM board WHERE id = 1) AS b * **INCR/DECR** 함수가 í¬í•¨ëœ **SELECT** ë¬¸ì˜ ê²½ìš°, ê²°ê³¼ í–‰ì˜ ê°œìˆ˜ê°€ 둘 ì´ìƒì´ë©´ 오류로 처리한다. 최종 결과가 í•˜ë‚˜ì¸ ê²½ìš°ì—ë§Œ ìœ íš¨í•˜ë‹¤. * **INCR/DECR** 함수는 ìˆ«ìž íƒ€ìž…ì— ëŒ€í•´ì„œë§Œ ì‚¬ìš©í• ìˆ˜ 있다. ì ìš© 가능한 íƒ€ìž…ì€ **SMALLINT**, **INTEGER**, **BIGINT**\ 와 ê°™ì€ ì •ìˆ˜í˜• ë°ì´í„° 타입으로 ì œí•œëœë‹¤. 기타 타입ì—는 ì‚¬ìš©í• ìˆ˜ 없다. * **INCR** 함수 호출 시 ê²°ê³¼ ê°’ì€ í˜„ìž¬ ê°’ì´ë©°, ì €ìž¥ ê°’ì€ í˜„ìž¬ ê°’ +1ì¸ ê°’ì´ ì €ìž¥ëœë‹¤. 결과를 ì €ìž¥ê°’ê³¼ ê°™ì€ ê°’ì„ ì¡°íšŒí•˜ê³ ìž í• ê²½ìš°ëŠ” 다ìŒê³¼ ê°™ì´ ìˆ˜í–‰í•œë‹¤. .. code-block:: sql SELECT content, INCR(read_count) + 1 FROM board WHERE id = 1; * ì •ì˜ëœ íƒ€ìž…ì˜ ìµœëŒ€ê°’ì„ ì´ˆê³¼í• ê²½ìš° **INCR** 함수는 해당 ì¹¼ëŸ¼ì„ 0으로 초기화 한다. 반대로 ìµœì†Œê°’ì— **DECR** 함수가 ì ìš©ë˜ì–´ë„ 0으로 초기화ëœë‹¤. * **INCR** / **DECR** 함수는 **UPDATE** 트리거와 무관하게 실행ë˜ë¯€ë¡œ ë°ì´í„° ì¼ê´€ì„±ì´ 보장ë˜ì§€ ì•Šì„ ìˆ˜ 있다. 다ìŒì€ **INCR** 함수가 **UPDATE** 트리거와 무관하게 실행ë˜ê¸° ë•Œë¬¸ì— ë°ì´í„°ë² ì´ìŠ¤ì˜ ì¼ê´€ì„±ì´ 위반ë˜ëŠ” 예ì´ë‹¤. .. code-block:: sql CREATE TRIGGER event_tr BEFORE UPDATE ON event EXECUTE REJECT; SELECT INCR(players) FROM event WHERE gender='M'; * **INCR** / **DECR** 함수는 HA êµ¬ì„±ì˜ ìŠ¬ë ˆì´ë¸Œ 노드나 read-only ëª¨ë“œì˜ CSQL ì¸í„°í”„리터(csql -r) ë˜ëŠ” Read Only, Standby Only 모드처럼 쓰기가 ê¸ˆì§€ëœ ëª¨ë“œ(cubrid_broker.confì˜ ACCESS_MODE=RO ë˜ëŠ” SO)ì˜ ë¸Œë¡œì»¤ì—서 사용 시 오류를 반환한다. **ì˜ˆì œ** ë¨¼ì €, board í…Œì´ë¸”ì—는 아래와 ê°™ì´ 3ê±´ì˜ ë°ì´í„°ê°€ ìž…ë ¥ë˜ì—ˆë‹¤ê³ ê°€ì •í•œë‹¤. .. code-block:: sql CREATE TABLE board ( id INT, title VARCHAR(100), content VARCHAR(4000), read_count INT ); INSERT INTO board VALUES (1, 'aaa', 'text...', 0); INSERT INTO board VALUES (2, 'bbb', 'text...', 0); INSERT INTO board VALUES (3, 'ccc', 'text...', 0); 다ìŒì€ id ê°’ì´ 1ì¸ ë°ì´í„°ì˜ read_count ì¹¼ëŸ¼ì˜ ê°’ì„ **INCR** 함수로 ì¦ê°€ì‹œí‚¤ëŠ” 예ì´ë‹¤. .. code-block:: sql SELECT content, INCR(read_count) FROM board WHERE id = 1; :: content read_count =================================== 'text...' 0 예와 ê°™ì´ **SELECT** ë¬¸ì— **INCR** 함수를 ì‚¬ìš©í•¨ìœ¼ë¡œì¨ í•´ë‹¹ 칼럼 ê°’ì€ read_count + 1ì´ ëœë‹¤. 결과는 다ìŒê³¼ ê°™ì€ **SELECT** ë¬¸ì„ í†µí•´ 확ì¸í•´ ë³¼ 수 있다. .. code-block:: sql SELECT content, read_count FROM board WHERE id = 1; :: content read_count =================================== 'text...' 1