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
운영게시판
최근게시물
MySQL Q&A 30111 게시물 읽기
No. 30111
자동증가 값 구하기
작성자
강삼수(kssmd)
작성일
2011-11-02 12:18ⓒ
2011-11-02 12:19ⓜ
조회수
10,988

안녕하세요.

동일한 레코드에  자동 증가  필드와  자동 증가 값이랑 동일한 값이 들어가는 필드가 있습니다.

현재는  insert 후에  SELECT LAST_INSERT_ID() 구해서 다시한번 update 을 하고 있습니다만

처음 insert 할때 한번에 값이 들어가게 하는 방법은 없나요.

두번 쿼리문을 보내니깐 중간에 에라가 나기도 하고, 시간 문제도 있고 해서요...

강삼수

 

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

 질문의 내용만으로는 자동 증가 값이랑 동일한 값이 들어가는 필드를 없애버리고 자동 증가 필드를 사용하시면 되겠습니다.

우욱님이 2011-11-04 17:55에 작성한 댓글입니다. Edit

썩 명쾌한 해결책은 아니지만, 되긴 됩니다.

우욱님 말씀대로 같은 값이라면 우욱님 댓글과 같이 그냥 쓰시는게 낫고, 그 값을 이용해서 뭔가 하시려면 아래와 같이 하실 수는 있습니다.

 INSERT INTO test_table ... VALUES ( (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=database() AND TABLE_NAME='test_table') );

 

같은 질문에 대한 답변을 했던 적이 있어, 그 링크도 드립니다.

http://idevelop.kr/questions/19/auto-increment

박현우(lqez)님이 2011-11-04 20:38에 작성한 댓글입니다.

우욱님 감사 합니다.

자동증가 값이랑 동일한 값이 나중에 경우에 따라서 수정되기 때문에 좀 불편하게 되어있습니다.

그리고 현우님 더욱 감사 합니다.

금방 이해가 되질않은 쿼리문 인데 좀더 연구하면 이해가 될줄 압니다.

감사 합니다.

강삼수님이 2011-11-07 09:58에 작성한 댓글입니다. Edit

설명이 좀 부족했습니다.

MySQL 5 부터 내장되어 있는 information_schema 데이터베이스에 있는 값을 활용한 쿼리입니다.

information_schema의 TABLES 란 테이블에 전체 데이터베이스의 테이블에 대한 값이 들어 있습니다.

 

이 값들을 SELECT 문으로 가져와 다양한 쿼리에 활용할 수 있게 되어 있습니다. 위의 예제에서는 AUTO_INCREMENT 값을 가져온 것입니다. 다음 링크를 참조하세요.

http://dev.mysql.com/doc/refman/5.1/en/information-schema.html

박현우(lqez)님이 2011-11-07 11:21에 작성한 댓글입니다.

현우님 처럼 사용하면

중복 입력되는 상황에서는 문제가 발생할 수 있습니다.

세션 2개 열어 테스트 해 보시기 바랍니다.

last_insert_id()는 세션별로 독립적으로 동작하지만

information_sechema는 lock을 이용하지 않는 한

원하시는 결과가 나오지 않을 것으로 보입니다.

박인호(paerae)님이 2011-11-07 13:51에 작성한 댓글입니다.

박인호님 지적 감사드립니다. 

일단, MyISAM에서는 말씀해주신 문제가 발생하지 않습니다. 이는 직접 n개의 프로세스가 여러 세션을 맺고 천만건씩 쓰도록 테스트하여 문제가 없음을 확인한 적이 있습니다. 단, 오늘 테스트해보니 InnoDB에서는 말씀해주신 문제가 발생합니다. table-level-lock과 row-level-lock의 차이라고 생각합니다.

 

하지만, last_insert_id()도 한 세션을 여러 프로세스가 공유한다면 마찬가지 문제가 생깁니다. 또한, 한 세션을 한 프로세스만 사용한다고 해도, 해당 프로세스가 다른 AUTO_INCREMENT 값을 사용하는 테이블에 INSERT 작업을 한 이후에는 대상 테이블에 사용할 수 없는 값을 돌려줄 수 있으므로, last_insert_id() 함수를 명시적인 락 + 별도 보관 장소 없이 사용하기에는 어렵다고 생각합니다. (예: A테이블에 인서트 > B테이블에 인서트 > A테이블에 인서트)

 

제 나름의 결론을 내리자면, 아래와 같습니다.

  • 높은 쓰기 성능이 필요한 경우 : MyISAM 엔진과 함께 information_schema 사용.
  • 작업이 다른 요청들과 함께 트랜잭셔널하게 처리되어야 하는 경우 : InnoDB 엔진과 더불어 명시적인 LOCK TABLE을 사용.

 

 

박현우(lqez)님이 2011-11-08 02:40에 작성한 댓글입니다.
이 댓글은 2011-11-08 06:07에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
301324개의 테이블 안에 원하는 값 조회..!! [1]
안인철
2011-11-10
8369
30131MyISAM 데이터 파일로 DB 복원(재구축) 가능 한가요? [2]
윤성진
2011-11-09
7620
30124통계관련 질의문 부탁 드립니다. [1]
통계좌절
2011-11-07
9937
30111자동증가 값 구하기 [6]
강삼수
2011-11-02
10988
30108[쿼리]어떤 방법이 좋을까요? [1]
전제영
2011-11-02
9035
30107mysql workbench 백업받기 [2]
김양훈
2011-11-01
12555
30098CPU 점유율이 너무 높아서 DB가 버벅거립니다. [1]
김용덕
2011-10-26
9246
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다