2010-07-20 1 views
2

내가 유일한없는 MySQL은/​​이노 에뮬레이션의 자동 증가는

  • 의 ID 필드를 사용

    조건

    1. 의 MySQL/이노에 자동 증가를 모방하기 위하여려고하고 가정 인덱스 또는 PK가 아닙니다.

    테이블 레벨 잠금없이 프로그램 논리를 사용하여 만 에뮬레이트 할 수 있습니까? 감사합니다. .

  • 답변

    2

    는 일련의 테이블과 트리거를 사용하여 자동 증가 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; 
    
    1

    다음 id 값을 저장하는 단일 행과 열로 다른 테이블을 만듭니다. 그런 다음 원본 테이블에 삽입 트리거를 만들어 두 번째 테이블의 값을 증가시키고 그 값을 가져 와서 첫 번째 테이블의 ID 열에 사용합니다. 선택 및 업데이트 작업을 수행하는 방식에주의를 기울여 원자가 원자 수준인지 확인해야합니다.

    기본적으로 MySQL sequence을 에뮬레이션합니다. 시퀀스 테이블의 단일 행에 잠금이 생길 수 있으므로 수행중인 작업에 적합하지 않을 수 있습니다.

    ETA :

    또 다른 유사하지만 어쩌면 더 나은 성능 옵션이 하나의 자동 증가 PK 컬럼 및 다른 데이터가 두 번째 "순서"테이블을 생성하는 것입니다. 삽입 트리거가 해당 테이블에 행을 삽입하고 거기에서 생성 된 ID를 사용하여 원래 테이블의 ID를 채 웁니다. 그런 다음 트리거 또는 다른 프로세스가 순서 테이블에서 모든 행을 정기적으로 삭제하여 정리하십시오.

    2
    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가 있는지 확인할 수있는 세션 안전 값인지 여부. 테이블 지원 트랜잭션이나 시퀀스의 구멍이 문제가 없는지 확인하십시오.