본문 바로가기

ㅋ/DB/mysql/mongo

mysql auto_increment 값 얻어오기

CREATE TABLE test ( 
no INT(3) NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (no)
)

방법1)
조악하지만 값을 하나 insert시킨다음
no값을 얻어오고(select 또는 mysql_insert_id();), update하는 것(여태껏 이래 생각했음)
-문제점 : 상당히 귀찮음
-문제점 : mysql_insert_id() 같은 경우 쿼리가 선행되어야 함.

방법2)
select max(no)+1 from test
현재까지의 데이터중 마지막을 추출하여 +1
-문제점 : 데이터가 없는 경우는 안됨
-문제점 : 마지막 데이터가 지워졌을 경우, 제대로 된 값을 얻어올 수 없음

방법3)
테이블 속성 이용하기 (출처 : http://elfrog.net/blog/view.php?articleID=134)
$query = "show table status where name='test'";
$res = mysql_query($query, $conn);
$table_info = mysql_fetch_array($res);
$table_idx = $table_info["Auto_increment"];

show table status는 테이블 상태 정보를 얻어오는 구문이다. 각각의 상태 정보는 차례대로 다음과 같다.
•Name: 테이블의 이름
•Engine: 테이블을 저장하는 엔진
•Row_format: 테이블 저장 포멧
•Rows: 테이블에 저장된 갯수, 특정 엔진에서는 불확실한 값이 저장된다. 확실한 값은 select count(*) 구문을 사용
•Avr_row_length: 평균 갯수
•Data_length: 데이터 파일 크기
•Max_data_length: 테이블에 저장될 수 있는 최대 데이터 크기
•Index_length: 인덱스 파일의 크기
•Data_free: 할당되었지만 사용되지 않는 공간 크기
•Auto_increment: 다음에 사용될 Auto_increment값
•Create_time: 테이블이 생성된 시간
•Update_time: 최근 업데이트된 시간
•Check_time: 최근 테이블이 조회된 시간
•Collation: 테이블 문자셋
•Checksum: The live checksum value(if any)
•Create_options: create table구문이 사용될때 썼던 옵션들
•Comment: 테이블 설명

차례대로 했으므로 $table_info[9]로 해되 된다...(정말?)

- 문제점 : \"SHOW TABLE STATUS\"를 사용할 경우에는 lock 을 걸지 않으면 사용자(쓰레드)가 많이 몰리게될때
프라이머리키가 서로 엉키는 심각한 오류가 발생할 수 있기 때문입니다. 
(http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=17253 )

정답은 없는듯...
상황에 맞게 써야 하겠어요

추가)
방법1)에서 필요한 부분만 우선 추가하고,
last_insert_id(db임), 혹은 mysql_insert_id(php임) 을 이용하여 값을 얻어오고
나머지 부분을 추가하면 되는구나!