MySQL:更新左连接视图,其中右表没有匹配的数据

时间:2009-07-20 15:32:32

标签: mysql

我很想知道这是否真的可以......

在这个简化的例子中,我有:

Table_A:           Table_B:

+------+--------+  +------+--------+
| id   | data_1 |  | id   | data_2 |
+------+--------+  +------+--------+
| 1    | Hello  |  | 1    | There  |
+------+--------+  +------+--------+
| 2    | Hi     |
+------+--------+

名为CREATE VIEW...的MySQL视图(tables)是:

SELECT table_a.id AS id, 
 table_a.data_1 AS data_1, 
 table_b.data_2 AS data_2
FROM table_a
LEFT JOIN table_b
ON table_a.id=table_b.id

因此,简单的SELECT * FROM tables将返回:

+------+--------+--------+
| id   | data_1 | data_2 |
+------+--------+--------+
| 1    | Hello  | There  |
+------+--------+--------+
| 2    | Hi     | NULL   |
+------+--------+--------+

现有数据的更新很好。也就是说,UPDATE tables SET data_2='World' WHERE id=1完成,id 1的结果将是:

+------+--------+--------+
| id   | data_1 | data_2 |
+------+--------+--------+
| 1    | Hello  | World  |
+------+--------+--------+

但如果没有任何与id匹配的数据,那么在右表(UPDATE)上使用table_b语句会怎样?使用与之前相同的示例,UPDATE tables SET data_2='John' WHERE id=2将导致匹配0行(因此tables仍会在NULL字段中返回John而不是data_2 )。

+------+--------+--------+
| id   | data_1 | data_2 |
+------+--------+--------+
| 2    | Hi     | NULL   |
+------+--------+--------+

有没有办法让这个工作在tables视图上,而不必直接触摸table_b

3 个答案:

答案 0 :(得分:1)

这实际上是一个插入,而不是更新,因为table_b中没有行,id = 2。您可以使用两个单独的语句来完成它,一个用于执行更新(使用内部联接),另一个用于执行插入。我怀疑在一个声明中是否可能。

答案 1 :(得分:0)

不,因为UPDATE没有行。

您需要INSERT,这就是您需要INSERT直接table_b行的原因。

如果您的table_b.idPRIMARY KEYUNIQUE KEY,您可以执行以下操作:

INSERT
INTO    table_b (id, data2)
VALUES  (2, 'There')

,如果UPDATE已存在于表格中,则id = 2将显示相应的行;如果不存在,则为INSERT

答案 2 :(得分:0)

如果你想做你所建议的,最好在table_b中维护一个外键,即使data_2没有值。正如已经回答的那样,需要两个陈述。首先,您必须使用table_a中缺少的键来回填table_b。这样的事情应该有效。

INSERT INTO table_b(id)
SELECT table_a.id, table_b.id
FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.id
WHERE table_b.id is null;

完成回填后,您的原始更新声明就可以了。