Я работаю с некоторым кодом. Существует несколько запросов, эффект которых, если строка существует с некоторыми заполненными данными, то та строка обновляется с остальной частью данных, и если строка не существует, новый создается. Они похожи на это:
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.
Вы уверены, что при обновлении используется только этот фрагмент кода?
Что происходит, так это то, что вы выполняете левое соединение с table_name (таблица для вставки новых записей) и фильтруете только для строк, которых нет в этой таблице. (WHERE B.id IS NULL)
Это похоже на действие «не существует», только по-другому.
Надеюсь, мой ответ может вам помочь.
С уважением.
LEFT JOIN / IS NULL означает, что запрос вставляет записи, которые еще не существуют. Предполагается, что таблица, определенная в предложении INSERT, такая же, как таблица в предложении LEFT JOIN - осторожно при абстрагировании ...
Мне интересно узнать, что такое % s