내가 유일한없는 MySQL은/이노 에뮬레이션의 자동 증가는
조건
- 의 MySQL/이노에 자동 증가를 모방하기 위하여려고하고 가정 인덱스 또는 PK가 아닙니다.
테이블 레벨 잠금없이 프로그램 논리를 사용하여 만 에뮬레이트 할 수 있습니까? 감사합니다. .
내가 유일한없는 MySQL은/이노 에뮬레이션의 자동 증가는
조건
테이블 레벨 잠금없이 프로그램 논리를 사용하여 만 에뮬레이트 할 수 있습니까? 감사합니다. .
는 일련의 테이블과 트리거를 사용하여 자동 증가 PK로 ID를 가질 필요 -이 같은 :
drop table if exists users_seq;
create table users_seq
(
next_seq_id int unsigned not null default 0
)engine = innodb;
drop table if exists users;
create table users
(
user_id int unsigned not null primary key,
username varchar(32) not null
)engine = innodb;
insert into users_seq values (0);
delimiter #
create trigger users_before_ins_trig before insert on users
for each row
begin
declare id int unsigned default 0;
select next_seq_id + 1 into id from users_seq;
set new.user_id = id;
update users_seq set next_seq_id = id;
end#
delimiter ;
insert into users (username) values ('f00'),('bar'),('bish'),('bash'),('bosh');
select * from users;
select * from users_seq;
insert into users (username) values ('newbie');
select * from users;
select * from users_seq;
을
다음 id 값을 저장하는 단일 행과 열로 다른 테이블을 만듭니다. 그런 다음 원본 테이블에 삽입 트리거를 만들어 두 번째 테이블의 값을 증가시키고 그 값을 가져 와서 첫 번째 테이블의 ID 열에 사용합니다. 선택 및 업데이트 작업을 수행하는 방식에주의를 기울여 원자가 원자 수준인지 확인해야합니다.
기본적으로 MySQL sequence
을 에뮬레이션합니다. 시퀀스 테이블의 단일 행에 잠금이 생길 수 있으므로 수행중인 작업에 적합하지 않을 수 있습니다.
ETA :
또 다른 유사하지만 어쩌면 더 나은 성능 옵션이 하나의 자동 증가 PK 컬럼 및 다른 데이터가 두 번째 "순서"테이블을 생성하는 것입니다. 삽입 트리거가 해당 테이블에 행을 삽입하고 거기에서 생성 된 ID를 사용하여 원래 테이블의 ID를 채 웁니다. 그런 다음 트리거 또는 다른 프로세스가 순서 테이블에서 모든 행을 정기적으로 삭제하여 정리하십시오.
CREATE TABLE sequence (id INTEGER); -- possibbly add a name;
INSERT INTO sequence VALUES (1); -- starting value
SET AUTOCOMMIT=0;
START TRANSACTION;
UPDATE sequence SET id = LAST_INSERT_ID(id+1);
INSERT INTO actualtable (non_autoincrementing_key) VALUES (LAST_INSERT_ID());
COMMIT;
SELECT LAST_INSERT_ID();
어떤 ID가 있는지 확인할 수있는 세션 안전 값인지 여부. 테이블 지원 트랜잭션이나 시퀀스의 구멍이 문제가 없는지 확인하십시오.
순서 표는