17.02.2020 08:45

Использование цикла WHILE в MySQL

Использование цикла WHILE в MySQL

В этой статье я объясню, как использовать цикл WHILE в MySQL. Недавно я столкнулся с задачей генерации порядковых номеров в MySQL (аналогично атрибуту AUTO_INCREMENT). К сожалению, в MySQL нет функции для генерации порядковых номеров. Но мы можем использовать оператор цикла WHILE для многократного выполнения блока кода при выполнении условия.

Например, давайте создадим простую таблицу продуктов:

--
-- Table structure for table `products`
--
CREATE TABLE IF NOT EXISTS `products` (
	`id` INT UNSIGNED NOT NULL,
	`code` VARCHAR(64) DEFAULT NULL
);

--
-- Dumping data for table `invoices`
--
INSERT INTO `products` (`id`) VALUES (1000), (1001), (1002), (1003), (1004), (1005), (1006), (1007), (1008), (1009), (1010);

Предположим, нам нужно добавить уникальные названия, содержащие порядковые номера, в поле `code`. Давайте создадим хранимую процедуру generateCodes, которая обновит поле `code` таблицы `products`:

DROP PROCEDURE IF EXISTS generateCodes;

DELIMITER $$
CREATE PROCEDURE generateCodes(startId INT, endId INT, codePrefix VARCHAR(64))
BEGIN
	SET @i = IFNULL(startId, 1);
	SET @n = 1;

	WHILE @i <= endId DO
		UPDATE `products` SET `code` = CONCAT(codePrefix, '_', @n) WHERE `id` = @i;
		SET @i = @i + 1;
		SET @n = @n + 1;
	END WHILE;
END $$
DELIMITER ;

К сожалению, вы не можете создать хранимую процедуру с проверкой на существование:

CREATE PROCEDURE IF NOT EXISTS generateCodes(startId INT, endId INT, codePrefix VARCHAR(64))

Поэтому вначале создания хранимой процедуры мы удаляем ее, чтобы не возникла ошибка "PROCEDURE generateCodes already exists".

Теперь мы можем вызвать хранимую процедуру generateCodes для добавления уникальных названий, содержащих порядковые номера:

CALL generateCodes(1000, 1004, 'first_category');
CALL generateCodes(1005, 1010, 'second_category');

Мы выведем результат, выполнив запрос:

SELECT * FROM `products`;

--
--	[output]
--
--	id		code
--	1000	first_category_1
--	1001	first_category_2
--	1002	first_category_3
--	1003	first_category_4
--	1004	first_category_5
--	1005	second_category_1
--	1006	second_category_2
--	1007	second_category_3
--	1008	second_category_4
--	1009	second_category_5
--	1010	second_category_6

Другие статьи