MySQL: обновление левого соединения, в котором правая таблица не имеет соответствующих данных - PullRequest
0 голосов
/ 20 июля 2009

Мне любопытно узнать, возможно ли это на самом деле ...

В этом упрощенном примере у меня есть:

Table_A:           Table_B:

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

MySQL View (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 завершается, и результат для идентификатора 1 будет:

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

Но как насчет использования оператора 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 ]

1 голос
/ 20 июля 2009

На самом деле это вставка, а не обновление, поскольку в table_b нет строки с id = 2. Вы можете сделать это с помощью двух отдельных операторов: один для обновления (с внутренним соединением), а другой для вставки. Я сомневаюсь, что это возможно в одном утверждении.

0 голосов
/ 20 июля 2009

Если вы хотите сделать то, что вы предлагаете, лучше сохранить внешний ключ в table_b, даже если для data_2 нет значения. Как уже было сказано, потребуется два заявления. Сначала вам нужно будет заполнить table_b недостающими ключами из table_a. Нечто подобное должно работать.

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 голосов
/ 20 июля 2009

Нет, поскольку нет строки 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, если ее нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...