Я работаю с некоторым кодом. Существует несколько запросов, эффект которых, если строка существует с некоторыми заполненными данными, затем эта строка обновляется вместе с остальными данными, а если строка не существует, создается новая. Они выглядят так:Как этот 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.
ах, поэтому это фактически не обновит запись, которая уже существует? это просто проверка того, что дублированные строки не создаются? – Claudiu
Yup, предложение where должно только убедиться, что это не дублирование. –
Здесь нет никакой разницы в том, чтобы сделать это против чего-то вроде: 'INSERT INTO table_name (col1, col2, col3) SELECT% s,% s,% s НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ * FROM table_name как T WHERE T.col1 =% s AND T.col2 =% s) '? – Claudiu