Как делает этот SQL-запрос для обновления строки, если существует, или вставьте в противном случае работу?

Я работаю с некоторым кодом. Существует несколько запросов, эффект которых, если строка существует с некоторыми заполненными данными, то та строка обновляется с остальной частью данных, и если строка не существует, новый создается. Они похожи на это:

INSERT INTO table_name (col1, col2, col3)
SELECT %s AS COL1, %s AS COL2, %s AS COL3
FROM ( SELECT %s AS COL1, %s AS COL2, %s AS COL3 ) A
LEFT JOIN table_name B
ON  B.COL1 = %s
AND B.COL2 = %s     --note: doesn't mention all columns here
WHERE B.id IS NULL
LIMIT 1

Я могу подражать этому шаблону, и это, кажется, работает, но я смущен относительно того, что на самом деле продолжается негласно. Кто-либо может объяснить, как это на самом деле работает? Я использую PostgreSQL.

7
задан tanascius 25 June 2010 в 16:11
поделиться

2 ответа

Вы уверены, что при обновлении используется только этот фрагмент кода?

Что происходит, так это то, что вы выполняете левое соединение с table_name (таблица для вставки новых записей) и фильтруете только для строк, которых нет в этой таблице. (WHERE B.id IS NULL)

Это похоже на действие «не существует», только по-другому.

Надеюсь, мой ответ может вам помочь.

С уважением.

3
ответ дан 7 December 2019 в 14:28
поделиться

LEFT JOIN / IS NULL означает, что запрос вставляет записи, которые еще не существуют. Предполагается, что таблица, определенная в предложении INSERT, такая же, как таблица в предложении LEFT JOIN - осторожно при абстрагировании ...

Мне интересно узнать, что такое % s

1
ответ дан 7 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

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