Если вы используете 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
}
EDIT / ADD:
Поскольку вы упомянули триггеры, я изучил это и считаю, что это выполнимо. Пара вопросов.
Доступ к "следующему автоинкрементному идентификатору" из триггера ... Я не знаю "хорошего" способа сделать это. В запросах INSERT у вас есть доступ только к НОВЫМ, а не к СТАРЫМ (существующим строкам) значениям (см. Синтаксис триггера ). В этом примере я просто поддерживаю отдельный счетчик @vcount на сервере. Чтобы инициализировать это значение тем идентификатором, который вы используете в данный момент, вы просто должны сделать «SET @vcount = 42;»
Алгоритм Луна. Вы должны будете реализовать это как функцию SQL. Вот валидатор Luhn в SQL, с которого вы могли бы написать детскую кроватку. В качестве альтернативы вы можете хешировать / проверять контрольную сумму с помощью встроенной функции MySQL, такой как MD5 (и использовать только первые символы 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», как вы и предлагали. Триггер добавит остальные.
Лично, если вы или кто-то другой не сможете лучше решить проблему автоинкремента / @ vcount, я все же предпочел бы выполнить транзакцию MySQL, которая лучше справится с задачей, чем хранение всего атомарного и сохранение всего кода вашего приложения на PHP.