InnoDBを使用している場合、簡単な修正は、既存のコードを使用して、それをMySQLトランザクションでラップすることです。すなわち、擬似コードで:
mysql_query("START TRANSACTION");
# get next autoincrement value into: $next
# do your INSERT query
# get the actual last inserted ID into: $actual
if ($next === $actual) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
# and raise an Exception or return an error
}
編集/追加:
あなたがトリガーについて言及したので、私はそれを調べて、それが実行可能であると信じています。いくつかの問題。
トリガーから「次の自動インクリメントID」にアクセスする...これを行うための「良い」方法がわかりません。INSERTクエリでは、NEW(既存の行)の値にはアクセスでき、OLD(既存の行)の値にはアクセスできません(トリガー構文を参照)。この例で私がしていることは、サーバー上に別個のカウンター@vcountを維持することです。この値を現在のIDに初期化するには、「SET @vcount=42;」を実行するだけです。
Luhnアルゴリズム。これをSQL関数として実装する必要があります。これがSQLのLuhnバリデーターです。または、MD5などのネイティブMySQL関数を使用してハッシュ/チェックサムを実行することもできます(短いバウチャーコードが必要な場合は、最初のX文字のみを使用します)。いずれにせよ、ハッシュ関数を作成する必要があります...以下の「Luhn」を使用します。
とにかく、トリガーは次のようになります。
delimiter //
CREATE TRIGGER make_voucher_code BEFORE INSERT ON vouchers
FOR EACH ROW
BEGIN
SET @vcount = @vcount + 1;
SET NEW.voucher = CONCAT(
NEW.voucher,
CAST(@vcount AS CHAR),
Luhn(CONCAT(NEW.voucher, CAST(@vcount AS CHAR))));
END;
//
delimeter ;
次に、INSERTで、提案したように、クエリに「64352」だけを入力します。トリガーは残りを追加します。
個人的には、あなたや他の誰かがautoincrement / @ vcountの問題をよりよく解決できない限り、MySQLトランザクションを実行することをお勧めします。これは、すべてをアトミックに保ち、すべてのアプリコードをPHPで保持するよりも優れた仕事をします。