Compte tenu de cette conception de la table dans une application Web:valeur Incrémenter sur la nouvelle ligne
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
Quelle est la façon la plus pratique et fiable pour insérer une nouvelle révision de la facture et récupérer le numéro de révision attribué?
La première approche évidente me paraît peu fiable dans un environnement partagé:
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);
Cette alternative semble légèrement mieux (je ne sais pas si c'est en fait mieux):
INSERT INTO invoice (invoice_nr, revision)
SELECT 31416, MAX(revision)+1
FROM invoice
WHERE invoice_nr = 31416;
... mais je ne peux pas connaître le numéro de révision sauf si je lance une nouvelle requête:
SELECT MAX(revision) AS last_revision
FROM invoice
WHERE invoice_nr = 31416;
Existe-t-il une méthode recommandée? L'application fonctionne sur PHP avec la bonne vieille extension de mysql-- mysql_query()
et al.
Je ne suis pas sûr de savoir pourquoi vous avez défini la colonne invoice_nr à auto_increment ici lorsque vous insérez plusieurs enregistrements (avec des révisions différentes) contre le même invoice_nr –
@ Baker Baker: Premièrement, parce que les révisions n'existaient pas dans les versions antérieures. Deuxièmement, parce que je pensais que AUTO_INCREMENT remplit toujours son objectif: les nouvelles factures nécessitent un nouveau numéro. –
Vous auriez peut-être intérêt à normaliser une table de factures et une table factice_revisions –