mysqlシーケンス番号生成方法

3959 ワード

サードパーティによってプライマリ・キーを生成する理由:
 
大量のデータは一般的にライブラリを適用し、ユーザーテーブルが32枚に分かれば、データ量が小さくなり、クエリーの速度が速くなります.
サブテーブルでプライマリ・キーの問題が発生します.各テーブルのプライマリ・キーが32テーブルで一意であることを保証するには、トラフィックに伴ってデータを再統合します.
32枚のテーブルが64以上になり、データも新しいルールで保存される可能性があるので、プライマリ・キーが一意であることを保証します.
 
int型プライマリ・キーは、インデックスとクエリーの速度に最も役立ちます.uuid 32ビット文字列をプライマリ・キーとして使用する人もいますが、インデックス・ストレージが増加し、クエリーの最適化に不利です.
 
 
ステップ1:テーブルの作成
 
 
CREATE TABLE `t_max_id` (
  `max_key` varchar(10) NOT NULL,
  `max_id` bigint(11) NOT NULL,
  PRIMARY KEY (`max_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 `max_key`はビジネスタイプ
 `max_id`は次のidで、昇順に増加します
 
テーブルタイプ用のInnoDB、トランザクションのサポート
 
ステップ2:ストレージ・プロシージャの構築
 
 
CREATE PROCEDURE `max_id`(p_max_key CHAR(10), OUT PARAM2 INT)
BEGIN
 START TRANSACTION;
	 SET @a= NULL;
	 SELECT max_id INTO @a FROM t_max_id WHERE max_key= p_max_key FOR UPDATE;
	 IF(@a IS NULL) THEN
	  SET @a=1;
	  INSERT INTO t_max_id(max_key,max_id) VALUES(p_max_key,2);
	 ELSE
	  UPDATE t_max_id SET max_id=max_id+1 WHERE max_key=p_max_key;
	 END IF;
	 SELECT @a INTO PARAM2;
 COMMIT;
END

 
select****FOR UPDATEは、本トランザクションCOMMITまで現在の結果セットの行をロックします.
 
ステップ3:javaはストレージプロセスを呼び出し、あるビジネスのプライマリ・キーidを取得する
 
 
@Test
	public void testCallPro(){
		  String param2Value = (String) jdbcTemplate.execute( 
				     new CallableStatementCreator() {
						public CallableStatement createCallableStatement(
								java.sql.Connection con) throws SQLException {
							// TODO Auto-generated method stub
							 String storedProc = "{call max_id(?,?)}";//    sql 
					           CallableStatement cs = con.prepareCall(storedProc); 
					           cs.setString(1, "order");//          
					           cs.registerOutParameter(2, java.sql.Types.INTEGER);//           
					         
							
							return cs;
						} 
				     }, new CallableStatementCallback() { 
				         public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { 
				           cs.execute(); 
				           return cs.getString(2);//          
				     } 
				  }); 
		  
		  System.out.println(param2Value);
	}

orderテーブルのプライマリ・キーを求めます
 
spring jdbcTemplateを使用しています
 
注意:
 
1.この方式には単一のポイントが存在し、すべてのプライマリ・キー生成はあるデータベースに依存し、一時的にダウンタイムするとすべての挿入に影響を与える.
2、最もよくRMIはサービスを提供して、データベースは一部のipのサービスに対して呼び出しストレージプロセスサービスを提供するだけで、insert、update、deleteサービスを提供しない
 
-------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
 
もう1つの簡単な呼び出し方法
 
 
 
CREATE PROCEDURE `max_id`(p_max_key CHAR(10))

BEGIN
	
	START TRANSACTION;
	 
		SET @a= NULL;
		 
		SELECT max_id INTO @a FROM t_max_id WHERE max_key= p_max_key FOR UPDATE;
		 
		IF(@a IS NULL) THEN
		  
		SET @a=1;
		  
		INSERT INTO t_max_id(max_key,max_id) VALUES(p_max_key,2);
		 
		ELSE
		  
		UPDATE t_max_id SET max_id=max_id+1 WHERE max_key=p_max_key;
		 END IF;
		 
		SELECT @a AS max_id;
	 

	COMMIT;
    
END$$

DELIMITER ;
 
出力パラメータが宣言されていません
 
 
@Test
	public void testCallPro2(){
		
		  System.out.println(jdbcTemplate.queryForInt("call max_id(?)",new Object[]{"order"}));
	}