Я вижу два возможных решения для этого:
1. Возможность:
Вы используете функцию, чтобы просто игнорировать sort_num
, если она не установлена:
`SELECT * FROM mytable ORDER BY coalesce(sort_num, id)`
coalesce()
возвращает первое ненулевое значение, поэтому вы должны вставить значения для sort_num
, если вам действительно нужно изменить порядок элементов.
2. Возможность:
Вы пишете триггер, который автоматически устанавливает значение, если оно не установлено в операторе вставки:
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
//
(вдохновлено этим комментарием )
Однако это может привести к проблемам с распараллеливанием (одновременная вставка нескольких запросов)