Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
SET @v:=2000;
INSERT INTO `table` SET `id`=@v:=@v+1; /* повторить нужное кол-во раз */
LIMIT 1 и добавить ORDER BY, запрос выполнится как раз за 0.3 сек, а может и быстрее. Попробуйте, интересно же.SELECT pool.phone FROM pool LEFT JOIN t1 ON (pull.phone = t1.phone) WHERE t1.phone IS NULL ORDER BY t1.phone LIMIT 1SELECT (`t1`.`phone`+1) as `empty_phone`
FROM `t1`
WHERE (
SELECT 1 FROM `t1` as `st` WHERE `st`.`phone` = (`t1`.`phone` + 1)
) IS NULL
ORDER BY `t1`.`phone`
LIMIT 1
@num != phone — все последующие тоже будут не совпадать.DELIMITER //
DROP FUNCTION IF EXISTS createRowEmptyId//
# вычисляет диапазон пропущенных id между before_id и after_id и возвращает строку для под запроса (union select id as alias;)
# аргумент alias назначает псевдоним колонке
# в глобальную переменную @prev устанавливается последний установленный id по параметру after_id
CREATE FUNCTION `createRowEmptyId`(before_id INT, after_id INT,alias VARCHAR(25))
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE answer TEXT DEFAULT '';
DECLARE count_ids INT DEFAULT 0;
SET count_ids=after_id-before_id-1;
WHILE count_ids>0 DO
SET answer=CONCAT_WS(' ',answer,'UNION SELECT ',after_id-count_ids,' as ',alias);
SET count_ids=count_ids-1;
END WHILE;
set @prev=after_id;
RETURN answer;
END//
DELIMITER ;
SET @prev=0;
# Основной Запрос
SELECT @select:= GROUP_CONCAT(DISTINCT createRowEmptyId(@prev,`id`) SEPARATOR ' ') FROM `test` ORDER BY `id` ASC ;
# Подзапрос который сформирует таблицу несуществующих id
set @select=TRIM(@select);
set @select=CONCAT_WS(' ',TRIM(LEADING 'UNION ' FROM @select),'ORDER BY `empty_id` ASC');
PREPARE stmt FROM @select;
EXECUTE stmt;
DROP FUNCTION createRowEmptyIdДля ряда БД еще можно использовать функции LEAD и LAG https://databasetips.net/2019/09/05/sql-3-ways-to-find-gaps-and-missing-values/
Изобретая велосипед или поиск отсутствующего значения ID в MySQL таблице