使用MySQL

时间:2017-04-13 09:51:42

标签: mysql sql database

我正在将数据库从一个项目迁移到另一个项目,而且表格格式不同,所以我必须正确格式化数据。

以下是一些查询示例:

INSERT INTO db1.first (a,b,c)
SELECT    x.a, z.b, x.c
FROM      db2.t2 x, db2.t3 z
WHERE     x.id = z.id

INSERT INTO db1.second (q,w)
SELECT    x.d, z.e
FROM      db2.t2 x, db2.t3 z
WHERE     x.id = z.id

这里发生的是我使用相同的SELECT查询(在我的实际情况下比这个例子更加丑陋)以便导入一些数据。唯一的区别是我没有为每个插入使用所有列,但获取的行完全相同(应用的条件与示例中的相同)。

正如您可以清楚地看到的,这导致了大量的复制粘贴和不便,有没有办法在不同的表中运行多个插入而不复制粘贴我的选择查询?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以尝试为该会话创建临时表:

CREATE TEMPORARY TABLE IF NOT EXISTS temp AS
SELECT
    x.a, z.b, x.c
FROM
    db2.t2 x
INNER JOIN db2.t3 z
    ON x.id = z.id

然后将此表用于两个插入:

INSERT INTO db1.first (a,b,c)
SELECT a, b, c FROM temp

INSERT INTO db1.second (q,w)
SELECT a, b FROM temp

请注意,我还使用带有INNER JOIN子句的ON显式替换为隐式表连接。这是目前普遍接受的加入方式。

如果您使用的是其他数据库,例如SQL Server或Oracle,最好的方法可能是使用公用表表达式(CTE)作为用于插入的公共查询。但由于MySQL不支持CTE,因此使用临时表是另一种选择。

请注意,MySQL中的临时表仅存在于该会话中,并在会话结束时自动删除。因此,除非您想在创建它的同一会话中删除它,否则无需显式删除它。