我有一个过程,我希望将一个表(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;
而不是变量。这似乎有效。
答案 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;
而不是变量。这似乎有效。