我正在将数据库从一个项目迁移到另一个项目,而且表格格式不同,所以我必须正确格式化数据。
以下是一些查询示例:
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查询(在我的实际情况下比这个例子更加丑陋)以便导入一些数据。唯一的区别是我没有为每个插入使用所有列,但获取的行完全相同(应用的条件与示例中的相同)。
正如您可以清楚地看到的,这导致了大量的复制粘贴和不便,有没有办法在不同的表中运行多个插入而不复制粘贴我的选择查询?
提前致谢!
答案 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中的临时表仅存在于该会话中,并在会话结束时自动删除。因此,除非您想在创建它的同一会话中删除它,否则无需显式删除它。