2009-07-20 19 views
0

我很好奇,想知道這實際上是可能的...MySQL的:更新左加入視圖,其中右表中沒有匹配的數據

在這個簡單的例子,我有:

Table_A:   Table_B: 

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

一個MySQL查看(CREATE VIEW...)稱爲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 | 
+------+--------+--------+ 

但是關於使用右側表(table_b)的UPDATE聲明,如果它不具有任何數據相匹配的ID是什麼?使用與前面相同的示例,UPDATE tables SET data_2='John' WHERE id=2將導致0行匹配(因此tables仍將在data_2字段中返回NULL而不是John)。

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

有沒有一種方法,使在tables鑑於這一工作,而無需直接觸摸table_b

回答

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; 

一旦你完成了回填,那麼你的原始更新語句就可以工作。

0

不,因爲UPDATE沒有排。

這裏您需要INSERT,這就是爲什麼您需要直接將INSERT排成table_b

如果您table_b.idPRIMARY KEYUNIQUE KEY,你可以做到以下幾點:

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

,這將UPDATE相應的行如果id = 2在表中已經存在,或者INSERT它,如果它不。

1

這實際上是一個插入,而不是更新,因爲table_b中id = 2時不存在行。你可以用兩個獨立的語句來完成,一個用來做更新(用一個內部連接),另一個用來做插入。我懷疑這是可能的在一個單一的聲明。

相關問題