Учитывая этот дизайн таблицы в веб-приложении:Увеличение значения на новой строке
CREATE TABLE `invoice` (
`invoice_nr` int(10) unsigned NOT NULL AUTO_INCREMENT,
`revision` int(10) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`invoice_nr`,`revision`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
Что наиболее удобный и надежный способ, чтобы вставить новую ревизию счета и получить обратно назначенный номер версии?
Первый очевидный подход поражает меня как ненадежные в общей среде:
SELECT MAX(revision)+1 AS next_revision -- E.g. 2
FROM invoice
WHERE invoice_nr = 31416;
INSERT INTO invoice (invoice_nr, revision)
VALUES (31416, 2);
Этот вариант выглядит немного лучше (я не знаю, если это на самом деле лучше):
INSERT INTO invoice (invoice_nr, revision)
SELECT 31416, MAX(revision)+1
FROM invoice
WHERE invoice_nr = 31416;
... но я не могу знать номер версии, если не запускаю новый запрос:
SELECT MAX(revision) AS last_revision
FROM invoice
WHERE invoice_nr = 31416;
Есть ли рекомендуемый метод?
Приложение работает на PHP с хорошим старым расширением mysql - mysql_query()
et al.
Я не совсем уверен, почему вы установили колонку invoice_nr быть AUTO_INCREMENT здесь при вставке нескольких записей (с разными версиями) против того же invoice_nr –
@Mark Baker: Во-первых, потому что изменений не было в более ранних версиях. Во-вторых, поскольку я думал, что AUTO_INCREMENT все еще служит своей цели: новые счета-фактуры требуют нового номера. –
Возможно, вам было лучше нормализовать таблицу счетов-фактур и таблицу invoice_revisions. –