Как работает этот SQL-запрос для обновления строки, если она существует, или вставки, если нет, работает? - PullRequest
7 голосов
/ 25 июня 2010

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

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.

Ответы [ 2 ]

3 голосов
/ 25 июня 2010

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

Что мешает, так это то, что вы делаете левое соединение с table_name (таблицей для вставки новых записей) и фильтруете только для строк, которые нене существует в этой таблице.(ГДЕ B.id НЕДЕЙСТВИТЕЛЕН)

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

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

С уважением.

1 голос
/ 25 июня 2010

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

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

...