1

私は MySql データベースを提供するホスト会社のユーザーです。複製の問題により、自動インクリメント値が 10 ずつ増加します。これは一般的な問題のようです。

私の質問は、列が連続した ID を持つように (安全に) 自動インクリメント機能をシミュレートするにはどうすればよいですか?

私の考えは、問題を解決するために何らかのシーケンスメカニズムを実装することでしたが、それが最善の選択肢であるかどうかはわかりません. 私はウェブ上でそのようなコードスニップセットを見つけました:

DELIMITER ;;

DROP TABLE IF EXISTS `sequence`;;
CREATE TABLE `sequence` (
  `name` CHAR(16) NOT NULL,
  `value` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY  (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;;

DROP FUNCTION IF EXISTS `nextval`;
CREATE FUNCTION `nextval`(thename CHAR(16) CHARSET latin1)
RETURNS BIGINT UNSIGNED
MODIFIES SQL DATA
SQL SECURITY DEFINER
BEGIN
  INSERT INTO `sequence` 
    SET `name`=thename, 
        `value`=(@val:=@@auto_increment_offset)+@@auto_increment_increment
   ON DUPLICATE KEY 
    UPDATE `value`=(@val:=`value`)+@@auto_increment_increment;
  RETURN @val;
END ;;

DELIMITER ;

これはまったく正しいようです。2 番目の質問は、このソリューションが並行安全かどうかです。INSERT文はもちろんですが、ON DUPLICATE KEYの更新はどうでしょうか?

ありがとう!

4

2 に答える 2

6

そもそもなんで持つ必要があるの?

== 1 を使用してもauto_increment_increment、テーブルの自動インクリメント フィールドに連続した値が含まれるという保証はありません (行が削除されたらどうなるでしょうか?)。

自動インクリメントを使用すると、フィールドが一意であることが db エンジンによって単純に保証されます。

編集: 繰り返します: 私の意見では自動インクリメント列の同時値のようなものを想定するのは良い考えではありません

EDIT2:とにかく、これは「挿入時」トリガーによって「解決」できます

create trigger "sequence_b_ins" before insert on `sequence`
for each row
begin
    NEW.id = select max(id)+1 from `sequence`;
end

または、これらの線に沿ったもの(申し訳ありませんが、テストされていません)

于 2009-11-11T16:51:10.817 に答える
0

別のオプションは、ストアド プロシージャを使用して挿入を行い、テーブルから最大 ID を選択するか、現在の ID を使用して別のテーブルを保持し、ID が使用されると更新することです。

于 2009-11-11T16:54:21.983 に答える