mysqlシーケンス番号生成方法
3959 ワード
サードパーティによってプライマリ・キーを生成する理由:
大量のデータは一般的にライブラリを適用し、ユーザーテーブルが32枚に分かれば、データ量が小さくなり、クエリーの速度が速くなります.
サブテーブルでプライマリ・キーの問題が発生します.各テーブルのプライマリ・キーが32テーブルで一意であることを保証するには、トラフィックに伴ってデータを再統合します.
32枚のテーブルが64以上になり、データも新しいルールで保存される可能性があるので、プライマリ・キーが一意であることを保証します.
int型プライマリ・キーは、インデックスとクエリーの速度に最も役立ちます.uuid 32ビット文字列をプライマリ・キーとして使用する人もいますが、インデックス・ストレージが増加し、クエリーの最適化に不利です.
ステップ1:テーブルの作成
`max_key`はビジネスタイプ
`max_id`は次のidで、昇順に増加します
テーブルタイプ用のInnoDB、トランザクションのサポート
ステップ2:ストレージ・プロシージャの構築
select****FOR UPDATEは、本トランザクションCOMMITまで現在の結果セットの行をロックします.
ステップ3:javaはストレージプロセスを呼び出し、あるビジネスのプライマリ・キーidを取得する
orderテーブルのプライマリ・キーを求めます
spring jdbcTemplateを使用しています
注意:
1.この方式には単一のポイントが存在し、すべてのプライマリ・キー生成はあるデータベースに依存し、一時的にダウンタイムするとすべての挿入に影響を与える.
2、最もよくRMIはサービスを提供して、データベースは一部のipのサービスに対して呼び出しストレージプロセスサービスを提供するだけで、insert、update、deleteサービスを提供しない
-------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
もう1つの簡単な呼び出し方法
出力パラメータが宣言されていません
大量のデータは一般的にライブラリを適用し、ユーザーテーブルが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"}));
}