programing

INSERT GRANGE가 auto_increment primary key를 증가시키는 이유는 무엇입니까?

topblog 2023. 9. 10. 11:53
반응형

INSERT GRANGE가 auto_increment primary key를 증가시키는 이유는 무엇입니까?

MySQL innodb 데이터베이스에 접속하는 자바 프로그램을 작성했습니다.

INSERT IGNOR 문에서 중복 항목이 발생할 때마다 Auto Increment 기본 키가 증분됩니다.

이 동작이 예상되는 것입니까?IGNORGE에서는 안 될 일이라고 생각합니다.즉, 새로운 기본 키 값을 쓰기 위한 추가 오버헤드가 실제로 발생합니다.

표는 다음과 같습니다.

CREATE TABLE `tablename` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `rowname` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `rowname` (`rowname`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

감사해요!

MySQL 5.1.22 이후 기본 동작입니다.

구성 변수를 다음과 같이 설정할 수 있습니다.0(일명 "전통적인" 잠금 모드) 자동 증가 열에 간격이 생기는 것을 방지하려면 다음과 같이 하십시오.그러나 이 모드는 다음 시간까지 테이블 잠금을 유지하는 효과가 있기 때문에 성능 패널티가 발생할 수 있습니다.INSERT완성됩니다.

InnoDB AUTO_INCRECTION Lock Mode에 대한 문서에서 다음을 참조하십시오.

innodb_autoinc_lock_mode = 0 ("추가" 잠금 모드)

기존 잠금 모드는 이전에 존재했던 것과 동일한 동작을 제공합니다.innodb_autoinc_lock_mode구성 파라미터는 MySQL 5.1에 도입되었습니다.기존의 잠금 모드 옵션은 하위 호환성, 성능 테스트, 의미론의 차이로 인한 "혼합 모드 삽입" 문제 해결을 위해 제공됩니다.

이 잠금 모드에서 모든 "INSERT-like" 문은 특별한 테이블 레벨을 얻습니다.AUTO-INC테이블에 삽입할 수 있도록 잠금AUTO_INCREMENT기둥들이 잠금은 주어진 시퀀스에 대해 자동 증가 값이 예측 가능하고 반복 가능한 순서로 할당되도록 하기 위해 일반적으로 문장의 끝에 고정됩니다(거래의 끝이 아님).INSERT문장과 주어진 문장에 의해 할당된 자동 입력 값이 연속적인지 확인합니다.

InnoDB에서 설정 가능한 설정이라고 생각합니다.참조: InnoDB의 AUTO_INCRECTION 처리

당신은 당신과 함께 가고 싶을 것입니다.

innodb_autoinc_lock_mode = 0
INSERT INTO `tablename` (id, rowname) SELECT '1', 'abc' FROM dual WHERE NOT EXISTS(SELECT NULL FROM `tablename` WHERE `rowname`='abc');

또는 short(아이디 필드가 표에 증분을 가지므로)

INSERT INTO `tablename` (rowname) SELECT 'abc' FROM dual WHERE NOT EXISTS(SELECT NULL FROM `tablename` WHERE `rowname`='abc');

해결책은 번거로워 보일 수 있지만, 저자가 필요로 하는 대로 작동합니다.

저는 이 행동이 합리적이라고 생각합니다.간격이 없는 시퀀스를 제공하기 위해 자동 증가를 사용해서는 안 됩니다.

예를 들어 롤백 트랜잭션은 여전히 ID를 사용합니다.

 INSERT INTO t (normalcol, uniquecol) VALUES 
   ('hello','uni1'),
   ('hello','uni2'),
   ('hello','uni1');

고유한 키 위반을 명확하게 생성하고 데이터베이스에 행을 삽입하지 않습니다(여기서는 트랜잭션 엔진으로 가정).그러나 아무것도 삽입하지 않고 최대 3개의 auto-inc 값을 소비할 수 있습니다.

예상 여부는 확실하지 않지만 다음 항목으로 전환하는 것이 좋습니다.

INSERT ... ON DUPLICATE KEY UPDATE

언급URL : https://stackoverflow.com/questions/5655396/why-insert-ignore-increments-the-auto-increment-primary-key

반응형