2010-06-25 1 views
7

Я работаю с некоторым кодом. Существует несколько запросов, эффект которых, если строка существует с некоторыми заполненными данными, затем эта строка обновляется вместе с остальными данными, а если строка не существует, создается новая. Они выглядят так:Как этот 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.

ответ

3

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

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

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

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

С уважением.

+0

ах, поэтому это фактически не обновит запись, которая уже существует? это просто проверка того, что дублированные строки не создаются? – Claudiu

+0

Yup, предложение where должно только убедиться, что это не дублирование. –

+0

Здесь нет никакой разницы в том, чтобы сделать это против чего-то вроде: 'INSERT INTO table_name (col1, col2, col3) SELECT% s,% s,% s НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ * FROM table_name как T WHERE T.col1 =% s AND T.col2 =% s) '? – Claudiu

1

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

Мне интересно знать, что %s является

+0

Я подозреваю, что это строка формата для функции sprintf(), аналогичная функции, а «% s» заменяется каким-то именем или значением перед отправкой SQL в СУБД. –

+0

yep,% s - данные (вы можете предположить, что это «foo», «bar», «baz» для этого примера), которые должны быть помещены в таблицу. – Claudiu

 Смежные вопросы

  • Нет связанных вопросов^_^