MySQL自己増分シーケンスの実装

11875 ワード

MySQLシーケンス効果の転載を実現
  • 新規シーケンステーブル
  • drop table if exists sequence;  
    create table sequence (      
    seq_name        VARCHAR(50) NOT NULL, --           
    current_val     INT         NOT NULL, --          
    increment_val   INT         NOT NULL    DEFAULT 1, --   (  )      
    PRIMARY KEY (seq_name)   );
    
  • シーケンス
  • を追加
    INSERT INTO sequence VALUES ('seq_test1_num1', '0', '1');
    INSERT INTO sequence VALUES ('seq_test1_num2', '0', '2');
    
  • シーケンスの現在値(v_seq_nameパラメータ値はシーケンス名を表す)
  • を取得するための関数を作成する.
    create function currval(v_seq_name VARCHAR(50))  
    returns integer 
    begin     
        declare value integer;      
        set value = 0;      
        select current_val into value  from sequence where seq_name = v_seq_name;
       return value;
    end;
    
  • 現在の値を問い合わせる
  • select currval('seq_test1_num1');
    
  • 作成関数は、シーケンスの次の値(v_seq_nameパラメータ値はシーケンス名を表す)
  • を取得するために使用される.
    create function nextval (v_seq_name VARCHAR(50))
        returns integer
    begin
        update sequence set current_val = current_val + increment_val  where seq_name = v_seq_name;
        return currval(v_seq_name);
    end;
    
  • 次の値を問い合わせる
  • select nextval('seq_test1_num1');
    
  • 新しいテーブルテスト用テーブル
  • 	DROP TABLE IF EXISTS `test1`;
    	CREATE TABLE `test1` (
    	  `name` varchar(255) NOT NULL,
    	  `value` double(255,0) DEFAULT NULL,
    	  `num1` int(11) DEFAULT NULL,
    	  `num2` int(11) DEFAULT NULL,
    	  PRIMARY KEY (`name`)
    	);
    
  • 新規フリップフロップ新規レコード挿入前に自増フィールドに値を付与フィールド自増効果
  • を実現する.
    CREATE TRIGGER `TRI_test1_num1` BEFORE INSERT ON `test1` FOR EACH ROW BEGIN
    set NEW.num1 = nextval('seq_test1_num1');
    set NEW.num2 = nextval('seq_test1_num2');
    END
    
  • 最終試験自己増加効果
  • INSERT INTO test1 (name, value) VALUES ('1', '111');
    INSERT INTO test1 (name, value) VALUES ('2', '222');
    INSERT INTO test1 (name, value) VALUES ('3', '333');
    INSERT INTO test1 (name, value) VALUES ('4', '444');
    
  • 結果は
  • を示した.
    SELECT * FROM test1;