Vejo duas soluções possíveis para isso:
1. Possibilidade:
Você usa uma função para simplesmente ignorar
sort_num
se não estiver definido:`SELECT * FROM mytable ORDER BY coalesce(sort_num, id)`
coalesce()
retorna o primeiro valor não nulo, portanto você deve inserir valores para sort_num
se você realmente precisar reordenar itens. 2. Possibilidade:
Você escreve um gatilho, que define automaticamente o valor se não estiver definido na instrução de inserção:
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
//
(inspirado por este comentário )
No entanto, isso pode ter problemas de paralelização (várias consultas inseridas ao mesmo tempo)