@kimqar202

SQL запрос как создать 9999 записей с итерацией чисел?

Есть таблица:
610cf328650fc557842126.png

Нужно сделать запросом 9999 записей, в которых значение "VALUE" будет увеличиваться на 1,
т.е вот так будет выглядеть:

ID 1, DATE_CREATE (сегодняшнее число и время), DATE_UPDATE (сегодняшнее число и время), ACTIVE (1), USER_ID (1), VALUE 1

ID 2, DATE_CREATE (сегодняшнее число и время), DATE_UPDATE (сегодняшнее число и время), ACTIVE (1), USER_ID (1), VALUE 2

ID 3, DATE_CREATE (сегодняшнее число и время), DATE_UPDATE (сегодняшнее число и время), ACTIVE (1), USER_ID (1), VALUE 3

ID 4, DATE_CREATE (сегодняшнее число и время), DATE_UPDATE (сегодняшнее число и время), ACTIVE (1), USER_ID (1), VALUE 4

и т.д

Как это сделать одним запросом? Или нужно каждый запрос выполнять 1 раз, т.е 9999 строк = 9999 запросов?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Fernus
@Fernus
Техник - Механик :)
Что мешает на "клиентской" стороне(средствами самого приложения) сгенерировать SQL ?

INSERT INTO `table` (`DATE_CREATE`, `DATE_UPDATE`, `ACTIVE`, `USER_ID`, `VALUE`) VALUES
(NOW(), NOW(), 1, 1, 1),
(NOW(), NOW(), 1, 1, 2),
(NOW(), NOW(), 1, 1, 3),
/*...*/
(NOW(), NOW(), 1, 1, 9999);


P.S.:
По скрину вижу, что Битрикс...можешь в текстовом файле даже составить запрос и выполнить через Админку Битрикса в разделе "SQL-запрос"...если это нужно всего на один раз...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@CamaroSS396
Смотря, какой вариант MySQL, вот MariaDB, например, умеет так
INSERT INTO table
SELECT
seq, NOW(), NOW(), 1, 1, seq
FROM seq_1_to_9999

Но вообще это задача для клиентской стороны.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SET `cte_max_recursion_depth` = 10000;
INSERT INTO `test` (`DATE_CREATE`, `DATE_UPDATE`, `ACTIVE`, `USER_ID`, `VALUE`) 
  WITH RECURSIVE `cte` (`DATE_CREATE`, `DATE_UPDATE`, `ACTIVE`, `USER_ID`, `VALUE`) AS (
    SELECT NOW(), NOW(), 1, 1, 1 AS `VALUE`
    UNION
    SELECT NOW(), NOW(), 1, 1, `VALUE`+1 FROM `cte` WHERE `VALUE` < 9999
  )
  SELECT *
    FROM `cte`
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
1. Вот оно надо, каждый раз заботиться об установлении значений полей DATE_CREATE/DATE_UPDATE?

ALTER TABLE tablename
MODIFY COLUMN date_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
MODIFY COLUMN date_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Всё, теперь они сами будут заботиться о правильном значении. Точнее, сервер будет об этом заботиться. Если, конечно, коду не придёт в голову устанавливать значения этих полей явно (нафига бы только - лишняя же работа).

2. Для выполнения операции используем рекурсивный CTE (помним, что поля DATE_CREATE/DATE_UPDATE сами заботятся о правильном значении, как и автоинкрементный первичный ключ):

INSERT INTO tablename (active, user_id, value)
WITH RECURSIVE
cte AS ( SELECT 1 num
         UNION ALL
         SELECT num + 1 FROM cte WHERE num < 9999 )
SELECT 1, 1, num
FROM cte;


Возможно, предварительно надо установить достаточное значение для сессионной переменной:SET SESSION cte_max_recursion_depth = 10000;

Если версия MySQL старая и не понимает CTE, то

INSERT INTO tablename (active, user_id, value)
SELECT 1, 1, 1 + t1.num + t2.num * 10 + t3.num * 100 + t4.num * 1000 AS value
FROM       (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1
CROSS JOIN (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2
CROSS JOIN (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3
CROSS JOIN (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4;
HAVING value <= 9999;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы