Je vois deux solutions possibles pour cela :
Vous utilisez une fonction pour simplement ignorer sort_num
s'il n'est pas défini :
`SELECT * FROM mytable ORDER BY coalesce(sort_num, id)`
coalesce()
renvoie la première valeur non nulle, vous insérez donc des valeurs pour sort_num
si vous avez vraiment besoin de commander à nouveau des articles.
Vous écrivez un déclencheur, qui définit automatiquement la valeur si elle n'est pas définie dans l'instruction d'insertion :
DELIMITER //
CREATE TRIGGER sort_num_trigger
BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
DECLARE auto_inc INT;
IF (NEW.sort_num is null) THEN
-- determine next auto_increment value
SELECT AUTO_INCREMENT INTO auto_inc FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME = 'mytable';
-- and set the sort value to the same as the PK
SET NEW.sort_num = auto_inc;
END IF;
END
//
(inspiré de ce commentaire )
Cependant, cela peut rencontrer des problèmes de parallélisation (plusieurs requêtes insérées en même temps)