有没有办法将此插入合并到选择查询中?

Posted

技术标签:

【中文标题】有没有办法将此插入合并到选择查询中?【英文标题】:Is there a way to consolidate this insert into select query? 【发布时间】:2021-05-14 08:34:52 【问题描述】:

用例: 对于存储在users 表中的某些特定测试qa 用户,我想在另一个名为user_limits 的表中更新或创建值,因此它们的值上限为1000

users表定义:

create table if not exists users
(
    id int unsigned auto_increment
        primary key,
    email varchar(255) not null
)

user_limits 定义:

create table if not exists user_limits
(
    user_id int unsigned not null,
    type_id smallint not null,
    remaining int not null,
    constraint user_limits_user_id_type_id_unique
        unique (user_id, type_id),
    constraint user_limits_user_id_foreign
        foreign key (user_id) references users (id)
);

我当前运行良好的查询是:

insert into user_limits
(user_id, type_id, remaining)
select id, 1, 1000
from users
where email like 'qa-%mydomain.com'
    ON DUPLICATE KEY UPDATE remaining = 1000;

insert into user_limits
(user_id, type_id, remaining)
select id, 2, 1000
from users
where email like 'qa-%mydomain.com'
    ON DUPLICATE KEY UPDATE remaining = 1000;

insert into user_limits
(user_id, type_id, remaining)
select id, 3, 1000
from users
where email like 'qa-%mydomain.com'
    ON DUPLICATE KEY UPDATE remaining = 1000;

insert into user_limits
(user_id, type_id, remaining)
select id, 4, 1000
from users
where email like 'qa-%mydomain.com'
    ON DUPLICATE KEY UPDATE remaining = 1000;

这是重复的,对从 1 到 4 的 type_id 值执行相同的操作,稍后可能必须对从 1 到 10 的类型执行此操作。

我尝试插入多个值,但出现语法错误,因为我必须先选择然后插入。 任何 mysql 专家都输入了如何编写更优雅和更短的查询?

我的 MySQL 版本是8.0.23

【问题讨论】:

使用递归 cte 生成 1 - 10。 【参考方案1】:

类似

INSERT INTO user_limits (user_id, type_id, remaining)
WITH RECURSIVE cte AS ( SELECT 1 num
                        UNION ALL
                        SELECT num + 1 FROM cte WHERE num < @maximal_typeid_value )
SELECT users.id, cte.num, 1000
FROM users
CROSS JOIN cte
WHERE users.email LIKE 'qa-%mydomain.com'
ON DUPLICATE KEY UPDATE users.remaining = 1000;

【讨论】:

以上是关于有没有办法将此插入合并到选择查询中?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SQL 中合并到 SELECT 中?

HSQLDB:优先选择查询而不是插入查询

TSQL - 选择插入的行

如何利用PowerQuery合并文件下的文件

SQL - 如何避免将三个查询合并为一个

SQL插入,使用合并存储过程更新