Обновление через подзапрос, что, если подзапрос не возвращает строк?

Можно сделать обман при помощи должностного лица () для вызова чего-то, что может сделать Запросы HTTP, как wget, но необходимо направить весь вывод от программы до где-нибудь, как файл или/dev/null, иначе процесс PHP будет ожидать того вывода.

, Если Вы хотите разделить процесс от апачского потока полностью, попробуйте что-то как (я не уверен в этом, но я надеюсь, что Вы получаете идею):

exec('bash -c "wget -O (url goes here) > /dev/null 2>&1 &"');

Это не хороший бизнес, и Вы, вероятно, захотите что-то как задание крона, вызывающее сценарий heartbeat, который опрашивает фактическую очередь событий базы данных, чтобы сделать реальные асинхронные события.

5
задан Juan Mellado 3 May 2012 в 10:34
поделиться

2 ответа

what happens if the subquery returns no rows? Will it do an update with nulls?

Yes-- you can test this like:

update YourTable
set col1 = (select 1 where 1=0)

This will fill col1 with NULLs. In case the subquery returns multiple rows, like:

update YourTable
set col1 = (select 1 union select 2)

The database will generate an error.

Secondly, is there a better way to write this. I am basically updating three fields in tableA from tableB, but the update should only happen if any of the three fields are different.

Intuitively I wouldn't worry about the performance. If you really wish to avoid the update, you can write it like:

UPDATE a
SET x = b.x, y = b.y, z = b.z
FROM tableA a, tableB b 
WHERE a.id = b.id AND (a.x <> b.x OR a.y <> b.y OR a.z <> b.z)

The WHERE clause prevents updates with NULL.

6
ответ дан 14 December 2019 в 13:38
поделиться

В informix, который я использовал, вариант решения Andomar:

UPDATE a
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id) )
WHERE tableA.id IN (SELECT fromTable.id
                    FROM tableA toTable, tableB fromTable
                    WHERE toTable.id = fromTable.id
                      AND ((toTable.x <> fromTable.x) 
                           OR (toTable.y <> fromTable.y)
                           OR (toTable.z <> fromTable.z))
0
ответ дан 14 December 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: