Как вставить несколько строк int MySQL, где значения одного столбца взяты из одного списка значений, а остальные являются постоянными - PullRequest
0 голосов
/ 23 января 2020

Я использую MariaDB 10.4. У меня есть список значений, то есть one@email.com, two@email.com и three@email.com (мой фактический список намного длиннее).

Я хотел бы сделать вставку SQL эквивалентную следующему:

insert into my_table(email, foreign_key_id, timestamp) values
('one@email.com', 1, now()),
('two@email.com', 1, now()),
('three@email.com', 1, now());

При этом нужно всего лишь написать что-то вроде select email from ('one@email.com', 'two@email.com', and 'three@email.com') где-нибудь в запросе вставки без дублирования констант / функций в каждой строке. Могу ли я сделать это в SQL без каких-либо временных таблиц?

Ответы [ 2 ]

1 голос
/ 24 января 2020
INSERT INTO my_table (email)
SELECT email
FROM JSON_TABLE( @value,
                 "$[*]" COLUMNS ( email VARCHAR(32) PATH "$" 
                                ) 
               ) AS parse_JSON;

fiddle

Применимо к MySQL 8 +


Для MariaDB 10.2.3+ используйте что-то близкое к (проблемы с онлайн-скрипкой непонятны ошибки, где явно нет ошибок - поэтому я не могу проверить)

INSERT INTO my_table (email)
WITH RECURSIVE
cte AS ( SELECT 0 AS num, JSON_VALUE(@json, '$[0]') AS email
         UNION 
         SELECT num + 1, JSON_VALUE(@json, CONCAT('$[', num + 1, ']'))
         FROM cte
         WHERE JSON_VALUE(@json, CONCAT('$[', num + 1, ']') IS NOT NULL
       )
SELECT email
FROM cte;
1 голос
/ 23 января 2020

Вы можете использовать select:

insert into my_table(email, foreign_key_id, timestamp) values
    select e.email, 1, now())
    from (select 'one@email.com' as email union all
          select 'two@email.com' union all
          select 'three@email.com'
        ) e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...