안녕하세요.
동일한 레코드에 자동 증가 필드와 자동 증가 값이랑 동일한 값이 들어가는 필드가 있습니다.
현재는 insert 후에 SELECT LAST_INSERT_ID() 구해서 다시한번 update 을 하고 있습니다만
처음 insert 할때 한번에 값이 들어가게 하는 방법은 없나요.
두번 쿼리문을 보내니깐 중간에 에라가 나기도 하고, 시간 문제도 있고 해서요...
강삼수
질문의 내용만으로는 자동 증가 값이랑 동일한 값이 들어가는 필드를 없애버리고 자동 증가 필드를 사용하시면 되겠습니다.
썩 명쾌한 해결책은 아니지만, 되긴 됩니다.
우욱님 말씀대로 같은 값이라면 우욱님 댓글과 같이 그냥 쓰시는게 낫고, 그 값을 이용해서 뭔가 하시려면 아래와 같이 하실 수는 있습니다.
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
우욱님 감사 합니다.
자동증가 값이랑 동일한 값이 나중에 경우에 따라서 수정되기 때문에 좀 불편하게 되어있습니다.
그리고 현우님 더욱 감사 합니다.
금방 이해가 되질않은 쿼리문 인데 좀더 연구하면 이해가 될줄 압니다.
감사 합니다.
설명이 좀 부족했습니다.
MySQL 5 부터 내장되어 있는 information_schema 데이터베이스에 있는 값을 활용한 쿼리입니다.
information_schema의 TABLES 란 테이블에 전체 데이터베이스의 테이블에 대한 값이 들어 있습니다.
이 값들을 SELECT 문으로 가져와 다양한 쿼리에 활용할 수 있게 되어 있습니다. 위의 예제에서는 AUTO_INCREMENT 값을 가져온 것입니다. 다음 링크를 참조하세요.
http://dev.mysql.com/doc/refman/5.1/en/information-schema.html
현우님 처럼 사용하면
중복 입력되는 상황에서는 문제가 발생할 수 있습니다.
세션 2개 열어 테스트 해 보시기 바랍니다.
last_insert_id()는 세션별로 독립적으로 동작하지만
information_sechema는 lock을 이용하지 않는 한
원하시는 결과가 나오지 않을 것으로 보입니다.
박인호님 지적 감사드립니다.
일단, MyISAM에서는 말씀해주신 문제가 발생하지 않습니다. 이는 직접 n개의 프로세스가 여러 세션을 맺고 천만건씩 쓰도록 테스트하여 문제가 없음을 확인한 적이 있습니다. 단, 오늘 테스트해보니 InnoDB에서는 말씀해주신 문제가 발생합니다. table-level-lock과 row-level-lock의 차이라고 생각합니다.
하지만, last_insert_id()도 한 세션을 여러 프로세스가 공유한다면 마찬가지 문제가 생깁니다. 또한, 한 세션을 한 프로세스만 사용한다고 해도, 해당 프로세스가 다른 AUTO_INCREMENT 값을 사용하는 테이블에 INSERT 작업을 한 이후에는 대상 테이블에 사용할 수 없는 값을 돌려줄 수 있으므로, last_insert_id() 함수를 명시적인 락 + 별도 보관 장소 없이 사용하기에는 어렵다고 생각합니다. (예: A테이블에 인서트 > B테이블에 인서트 > A테이블에 인서트)
제 나름의 결론을 내리자면, 아래와 같습니다.