在变量中保存选择查询并在更新和插入中使用它

时间:2016-03-08 15:08:29

标签: mysql database

我有一个过程,我希望将一个表(A)的一些数据带到另一个(B),如果某些列相等则更新Bs行并插入新行(如果不是这种情况)。
之后我想从表A中删除所有这些行(保留那些未从select语句中查询的行以及通过该过程的update / insert和delete语句之间的另一个进程添加的行)。

对于该用例,我想在变量中存储select查询的结果,然后在从结果中删除每个条目之前对其进行插入和更新。

感谢您的帮助。 马丁

更新: 我做了以下事情:

CREATE DEFINER=`martin`@`%` PROCEDURE `validateData`()
BEGIN
select * from write_data as temp_write_data;

UPDATE read_data AS r
    LEFT JOIN 
    temp_write_data as w
    ON [...]
    SET [...]
    WHERE [...];

INSERT INTO read_data AS r
    SELECT [...]
    FROM temp_write_data
    WHERE [...];

DELETE write_data.* FROM write_data
    LEFT JOIN temp_write_data
    using(guid)
    WHERE temp_write_data.somecolumn is not null;
end//

但是我担心这不起作用。

解决方案:

我用过:

CREATE TEMPORARY TABLE IF NOT EXISTS temp_write_data AS (SELECT * FROM write_data);

DROP TEMPORARY TABLE temp_write_data;

而不是变量。这似乎有效。

2 个答案:

答案 0 :(得分:0)

如果是针对长期项目,您可能需要查看现有的对象关系映射工具。如果您只需要一种快速而又脏的方法来保存查询结果,您可以编写自己的数据值对象(即表示单行数据的对象)并创建这些对象的列表(即表示数据的变量)是一个Row对象列表)。或者您可以对其进行更精简,并将查询返回的数据存储在地图列表中。在Java中,这就像List<Map<String,Object>>。在这种情况下,Map表示单行,字符串表示列的名称,Object表示该行的值。该列表表示行的集合。

答案 1 :(得分:0)

解决方案:

我用过:

 CREATE TEMPORARY TABLE IF NOT EXISTS temp_write_data AS (SELECT * FROM write_data);

 DROP TEMPORARY TABLE temp_write_data;

而不是变量。这似乎有效。