2011-03-14 3 views
3

auto_increment 속성이있는 필드없이 삽입하는 동안 auto_increment 시나리오를 시뮬레이트하고 싶습니다.동일한 문장에서 mysql insert select

insert into acct set id=(select @vid:=max(id)+1); select @vid; 

는 기본적으로, 내가 삽입을 원하고 그래서 장해의 가치를 보장 할 수있는 같은시에 실시하는 선택 독특 다음은 시나리오 SQL 문입니다.

+3

MySQL에있는 auto_increment 기능을 사용하지 않는 이유는 무엇입니까? http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html – DXL

+3

자신의 auto_increment 기능을 롤업하려고하면 동시성 문제가 발생할 것입니다. –

답변

0
insert into acct values ((select max(id)+1 from acct), ... rest_of_vars); 
+0

삽입물에서이 값을 어떻게 읽습니까? 즉, 삽입 작업 중에 select max (id) +1의 값을 알아야합니다. – Ken

+0

new - incremented - 값이 자동으로 삽입되므로 값을 알 필요가 없습니다. 필요하다면 (select max(id)+1 from acct) bensiu

0
당신은 테이블에 액세스 할 또 다른 사람을 보장 할 수있는 transaction이 모든 작업을 수행 할 수 있습니다

: 당신이 autoincremented 값이 보장 고유성와의 거래를 통해 공유하고자 할 경우

START TRANSACTION; 
insert into acct set id=(select @vid:=max(id)+1); 
select @vid; 
COMMIT; 
+0

트랜잭션없이 하나의 SQL 문에서이를 수행 할 수 있습니까? 기본적으로 삽입 작업 중에 max (id) +1의 값을 읽고 싶습니다. – Ken

1

, 당신은해야을 마지막 고유 값을 보유 할 모든 트랜잭션에 대해 보이는 잠글 수있는 싱글 톤.

MyISAM에서 서버 시작 후 첫 번째 삽입시 MAX(id)으로 채워진 특수 메모리 개체에 테이블의 메타 데이터 InnoDB에 저장됩니다.

물론 하나의 레코드로 전용 테이블을 만들 수는 있지만 솔직히 그러한 솔루션의 빌드 인 기능에 대한 이점은 없습니다.