从视图中选择 - >更新或插入表格

时间:2013-11-21 12:29:45

标签: mysql sql

我想从mysql-view中选择数据,该数据收集并加入来自“federated”-tables的数据。 应将此数据插入到与视图非常相似的表中。

一个例子是:

需要插入或更新数据的表格:

insertTable

+----+-----------+------+-------------+
| id | foreignId | data | foreignData |
+----+-----------+------+-------------+
|  1 | a         |  111 | aaa         |
|  2 | b         |  222 | bbb         |
+----+-----------+------+-------------+

数据来源的视图:

数据视图

+-----------+-------------+
| foreignId | foreignData |
+-----------+-------------+
| a         | AAA         |
| b         | BBB         |
| c         | CCC         |
+-----------+-------------+

insertTable

+----+-----------+------+-------------+
| 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];
}

2 个答案:

答案 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`;