MySql 错误 1093 尝试使用两个数据库和两个表进行更新

Posted

技术标签:

【中文标题】MySql 错误 1093 尝试使用两个数据库和两个表进行更新【英文标题】:MySql Error 1093 trying to UPDATE using two databases and two tables 【发布时间】:2020-12-10 06:48:15 【问题描述】:

DataBase_1 有一个用户列表及其 vBulletinId

DataBase_2 有 vBulletin 用户及其 vBulletinId 和 UserGroupId

我想从 Database_2 中找到所有不在 Database_1 中的 vBulletin 用户,并将他们的 UserGroupId 更改为 15

UPDATE database_2.user 
SET 
    usergroupid = 15
WHERE
(
    SELECT UserId
    FROM database_2.user 
    WHERE UserId NOT IN 
    (
            SELECT vBulletinId 
            FROM database_1.Users 
    )
);

目前我收到一个“您无法在 FROM 子句中指定目标表 'user' 进行更新”

任何帮助都会很棒。谢谢。

=== 解决方案 ===

一个有效的简化解决方案。

UPDATE database_2.user 
SET 
    usergroupid = 15
WHERE userid NOT IN 
(
    SELECT vBulletinId FROM database_1.Users
);

【问题讨论】:

【参考方案1】:
UPDATE database_2.user
LEFT JOIN database_1.Users ON database_2.user.UserId = database_1.Users.vBulletinId 
SET database_2.user.usergroupid = 15
WHERE database_1.Users.vBulletinId IS NULL

UPDATE database_2.user
SET database_2.user.usergroupid = 15
WHERE NOT EXISTS ( SELECT NULL
                   FROM database_1.Users
                   WHERE database_2.user.UserId = database_1.Users.vBulletinId )

【讨论】:

谢谢。但是这个查询时间太长了,我的连接在 30 秒后就断开了。我首先使用 SELECT FROM 对其进行了测试。 @Bubba 这可能是由于表格统计数据不舒服。 NOT EXISTS 变体添加 - 检查。 谢谢。对于 NOT EXISTS 变体,我必须设置 50 行的限制(这需要 18 秒)。 100 行将触发 30 秒超时。我通过上面的SELECT 查询知道,db2 (197k) 中有 37,717 个用户不在 db1 (160k) 中。所以我想我需要一些处理时间更少的东西。出于某种原因,NULL 花费的时间太长了。 @Bubba 用于连接的列的索引是否存在于表中?

以上是关于MySql 错误 1093 尝试使用两个数据库和两个表进行更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQL绕过错误1093

MySQL 更新错误 1093

Mysql 错误:1093 - 无法在 FROM 子句中指定要更新的目标表

使用select主键删除mysql(错误1093)

mysql 1093错误

使用mysql merge into 时遇到的mysql #1093错误的解决