我想从mysql-view中选择数据,该数据收集并加入来自“federated”-tables的数据。 应将此数据插入到与视图非常相似的表中。
一个例子是:
需要插入或更新数据的表格:
+----+-----------+------+-------------+ | id | foreignId | data | foreignData | +----+-----------+------+-------------+ | 1 | a | 111 | aaa | | 2 | b | 222 | bbb | +----+-----------+------+-------------+
数据来源的视图:
+-----------+-------------+ | foreignId | foreignData | +-----------+-------------+ | a | AAA | | b | BBB | | c | CCC | +-----------+-------------+
+----+-----------+------+-------------+ | id | foreignId | data | foreignData | +----+-----------+------+-------------+ | 1 | a | 111 | AAA | | 2 | b | 222 | BBB | | 3 | b | | CCC | +----+-----------+------+-------------+
并且此时我认为我需要一个存储过程,其执行以伪代码
编写$result = SELECT * FROM dataView;
foreach $result as $row {
if(SELECT COUNT(*) FROM inserTable WHERE foreignId=$row[foreignId]>0)
UPDATE insertView SET foreignData = $row[foreignData] WHERE foreignId=$row[foreignId];
else
INSERT INTO insertView (id, foreignId, foreignData) VALUES (null,$row[foreignId],$row[foreignData];
}
答案 0 :(得分:0)
您可以使用REPLACE查询。
REPLACE INTO insertView (id, foreignId, foreignData) VALUES (null,$row[foreignId],$row[foreignData];
来自mysql文档
REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中 table与PRIMARY KEY或UNIQUE的新行具有相同的值 index,在插入新行之前删除旧行。看到 第13.2.5节“INSERT语法”。
未指定PRIMARY KEY或UNIQUE索引会插入新行。
所以不需要SELECT检查。
答案 1 :(得分:0)
这个问题的理想选择是 ON DUPLICATE KEY UPDATE
在我的例子中,解决方案看起来像这样:
INSERT INTO insertTable
(
`foreignId`,
`foreignData`
)
SELECT
`dataView`.`foreignId`,
`dataView`.`foreignData`
FROM
`dataView`
ON DUPLICATE KEY UPDATE
`foreignId` = `dataView`.`foreignId`,
`foreignData` = `dataView`.`foreignData`;