在 MYSQL 中更新插入多个表

问题描述 投票:0回答:1

我正在尝试创建代码,以便在更新 1 个或多个源表时更新表(从 2 个联接创建)。

这是原始代码:

REPLACE INTO operations (
    customerId,
    customerCreated
    _Id
    paymentsCreated
    status,
    amounts,
    commerceName)
SELECT
    cu.customerId,
    cu.customerCreated
    p._Id
    p.paymentsCreated
    p.status,
    p.amounts,
     c.commerceName)
FROM
    payments p
LEFT JOIN
  commerces c ON c._id = p.commerceId
LEFT JOIN 
  customers cu ON cu.customerId = p.customerId

如您所见,有 3 个表,每个表都可以通过修改很久以前创建的记录来随时更改。

嗯,我正在尝试使用这段代码,但我不知道它是否是最好的选择,并且它是最快的,因为表有数百万条记录。

REPLACE INTO operations (
    customerId,
    customerCreated,
    _Id,
    paymentsCreated,
    status,
    amounts,
    commerceName
)
SELECT
    cu.customerId,
    cu.customerCreated,
    p._Id,
    p.paymentsCreated,
    p.status,
    p.amounts,
    c.commerceName
FROM
    payments p
LEFT JOIN
    commerces c ON c._id = p.commerceId
LEFT JOIN 
    customers cu ON cu.customerId = p.customerId
WHERE
    cu.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) OR
    p.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) OR
    c.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY);
mysql replace left-join upsert
1个回答
0
投票

假设您在

updated
列上有索引,将您的选择拆分为三个单独的选择,然后将它们与 UNION 组合可能会效果更好。

SELECT cu.customerId, cu.customerCreated, p._Id, p.paymentsCreated, p.status, p.amounts, c.commerceName
FROM payments p
LEFT JOIN commerces c ON c._id = p.commerceId
LEFT JOIN customers cu ON cu.customerId = p.customerId
WHERE p.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)

UNION

SELECT cu.customerId, cu.customerCreated, p._Id, p.paymentsCreated, p.status, p.amounts, c.commerceName
FROM payments p
INNER JOIN commerces c ON c._id = p.commerceId
LEFT JOIN customers cu ON cu.customerId = p.customerId
WHERE c.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)

UNION

SELECT cu.customerId, cu.customerCreated, p._Id, p.paymentsCreated, p.status, p.amounts, c.commerceName
FROM payments p
LEFT JOIN commerces c ON c._id = p.commerceId
INNER JOIN customers cu ON cu.customerId = p.customerId
WHERE cu.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY);
© www.soinside.com 2019 - 2024. All rights reserved.