자유게시판

제목 CI에서 내가 알고 싶은 정보는 다시 CI로 돌아온다
글쓴이 risa 작성시각 2013/05/08 13:52:32
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 9448   RSS
 오늘 다시 한번 CI에 굴복 했습니다 털썩.

 $this->db->insert($table, $data);
이후에  최근 글을 가져올려고 여태

$this->db->select_max("num");
를 했습니다.

트리거 명령처럼

NEW.num 같은게 있으면 참 좋을텐데... 라는 생각이 들면서

분명히  CI 헬퍼에서 한번 본 기억이 났습니다

못보더라도 CI에서 안만들었을리 없다는 생각에 찾아보니

$this->db->insert_id(); 


네. 분명히 있죠.

그런데 문득 드는 궁금함....

대체 insert_id(); <- 이거 뭐하는 녀석이야?

이거 그냥  $this->db->select_max("num"); 같은거면 꼭 쓸 이유가 없으니깐 말이죠.


열심히 찾아서 들어가니 리턴 하나 합니다.

mysql_insert_id()

를 리턴 하더군요.
[참고로 MSSQL은 SCOPE_IDENTITY()]

저것과 연관되서 검색 되는 다른 기능은
 
LAST_INSERT_ID()  입니다.

차이는 
mysql_insert_id 는 쿼리를 기준으로 라스트 코드값.
LAST_INSERT_ID 는 auto_increment  라스트 값 입니다.



보너스. php.net 에 올라온 다른 함수도 봤습니다만

$sql = "UPDATE `mytable` SET `mytable_id`= LAST_INSERT_ID(`mytable_id` + 1) WHERE ...;



function get_new_id($table){
 
$select 'select max(`id`) +1as `id` from `'.$table.'`  where `id` != <some big id>';
 
$query mysql_query($select);
 
$obj mysql_fetch_object($query);
 return 
$obj->id;



$this->db->insert_id();
우리에겐 insert_id가  있는 이상 큰 의미는 없는듯.

한개를 알기 위해서 여러개를 알게 해주네요 -_-!
 다음글 ci입문서 드디어 세상에 나옵니다. (21)
 이전글 CI3 공개가 임박한것 아닐까요 (2)

댓글

들국화 / 2013/05/08 14:12:04 / 추천 0
 $this->db->select_max("num");
를 사용하면 혼자만 쓰는게 아니면 잘못될된 값을 가져올수 있습니다. Insert후에 바로 Select 하기 때문에 아주 빠르게 이루어 짐으로 가능 성은 낮으나 만약 동시에 insert 가 실행 되면 잘못된 값을 가져올수 있을것 같네요.
아니면 테이블에 락킹을 걸어야 제대로된 값을 가져 옵니다.
LAST_INSERT_ID()  값은 해당세션의 값을 가져옮으로 정확한 값을 가져 올수 있습니다.
risa / 2013/05/08 14:18:37 / 추천 0
 네. 저도 그게 불안해서 확 트랜잭션이라도 걸어버릴까? 했는데

셀렉트 문을 포함시킨 트랜잭션은 미치지 않고서야 ( ..)

그래서 찾아본것이 LAST_INSERT_ID()  와 mysql_insert_id() 입니다.

일단 PHP라인에서 처리하는게 아니라 MYSQL  라인에서 처리 한다는게 더 신뢰도가 높으니깐요.

범용성을 생각 해서인지 mysql_insert_id 를 선택한 CI 따라 mysql_insert_id를 자주 써야겠어요.



변종원(웅파) / 2013/05/08 15:11:56 / 추천 0
매번 하는 이야기지만 매뉴얼이 갑!!!! 입니다. ^^