вставьте строки с помощью запроса al oop in mysql - PullRequest
1 голос
/ 20 апреля 2020

Мне нужно вставить несколько строк для каждого продукта с al oop, но я получаю синтаксическую ошибку. я не знаю почему.

Это мой запрос:

CREATE PROCEDURE insertURL()
BEGIN

    DECLARE i INT DEFAULT 0;

    WHILE (i <= 120) DO
        INSERT INTO product_images (alt, url, `index`, product_id) 
                VALUES ('productImage', 'image/products/producte.png', 1, i);
                VALUES ('productImage', 'image/products/producte.png', 0, i);
                VALUES ('productImage', 'image/products/producte.png', 0, i);                               
                VALUES ('productImage', 'image/products/producte.png', 0, i);               
        SET i = i + 1;
    END WHILE;
END

И я получаю эту ошибку:

SQL Ошибка (1064): у вас есть ошибка в вашем SQL синтаксисе; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом со строкой 4

1 Ответ

1 голос
/ 20 апреля 2020

Если вы используете MySQL 8.0 (или MariaDB 10.2 или выше), вы можете использовать рекурсивный запрос для этого. Это должно быть намного эффективнее, чем использование al oop.

insert into product_images (alt, url, `index`, product_id) 
with recursive cte as (
    select 0 i
    union all select i + 1 from cte where i < 120
)
select 
    'productImage',
    'image/products/producte.png', 
    x.n, 
    c.i
from cte c
cross join (select 1 n union all select 0 union all select 0 union all select 0) x

. Выражение рекурсивной общей таблицы генерирует числа от 0 до 120. Затем мы можем cross join это с фиксированным списком значений (1, 0, 0, 0), чтобы сгенерировать строки для insert.

. Вы можете легко превратить это в процедуру:

delimiter $$

create procedure inserturl()
begin
    insert into product_images (alt, url, `index`, product_id) 
    with recursive cte (
        select 0 i
        union all select i + 1 from cte where i < 120
    )
    select 
        'productImage',
        'image/products/producte.png', 
        x.n, 
        c.i
    from cte c
    cross join (select 1 n union all select 0 union all select 0 union all select 0) x;
end
$$

delimiter ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...