我很想知道这是否真的可以......
在这个简化的例子中,我有:
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
?
答案 0 :(得分:1)
这实际上是一个插入,而不是更新,因为table_b中没有行,id = 2。您可以使用两个单独的语句来完成它,一个用于执行更新(使用内部联接),另一个用于执行插入。我怀疑在一个声明中是否可能。
答案 1 :(得分:0)
不,因为UPDATE
没有行。
您需要INSERT
,这就是您需要INSERT
直接table_b
行的原因。
如果您的table_b.id
是PRIMARY KEY
或UNIQUE 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;
完成回填后,您的原始更新声明就可以了。