При обновлении записей запрос не возвращает “нет затронутых строк”
Я написал запрос, который будет проверять наличие записи, если условие истинно, он будет обновляться, иначе он вставит новую запись. Проблема в том, что при вставке он возвращается
Query returned successfully: 1 rows affected, 200ms execution time.
но при обновлении он возвращается
Query returned successfully: 0 rows affected, 190 ms execution time.
но значение обновляется правильно.вот пример скрипта для создания таблицы
CREATE TABLE sample ( templateid integer NOT NULL DEFAULT nextval('checktemplate_language_lookup_seq'::regclass), languageid integer NOT NULL, templatetitle character varying(100), disclaimer text, createdby integer NOT NULL, createdtimestamp timestamp without time zone NOT NULL DEFAULT ('now'::text)::timestamp without time zone, updatedby integer, updatedtimestamp timestamp without time zone, CONSTRAINT sample_templateid_languageid UNIQUE (templateid, languageid) )
Чтобы вставить новую запись в таблицу :
WITH new_values (templateId, languageId, templatetitle, disclaimer, createdby,createdtimestamp,updatedby,updatedtimestamp) AS ( VALUES (1, 1, 'LangTemplateTitle1', 'LangDisclaimer1', 1,current_timestamp,1,current_timestamp) ), upsert AS ( UPDATE sample m SET templatetitle = nv.templatetitle, disclaimer = nv.disclaimer, updatedby = nv.updatedby, updatedTimeStamp = nv.updatedtimestamp FROM new_values nv WHERE m.templateId = nv.templateId AND m.languageId = nv.languageId RETURNING m.* ) INSERT INTO sample (templateId, languageId, templatetitle, disclaimer, createdby,createdtimestamp) SELECT templateId, languageId, templatetitle, disclaimer, createdby ,createdtimestamp FROM new_values WHERE NOT EXISTS ( SELECT 1 FROM upsert up WHERE up.templateId = new_values.templateId AND up.languageId = new_values.languageId )
Чтобы обновить одну и ту же строку с разными значениями:(обновлено одно и то же значение запроса)
WITH new_values (templateId, languageId, templatetitle, disclaimer, createdby,createdtimestamp,updatedby,updatedtimestamp) AS ( VALUES (1, 1, 'LangTemplateTitle2', 'LangDisclaimer2', 1,current_timestamp,1,current_timestamp) ), upsert AS ( UPDATE sample m SET templatetitle = nv.templatetitle, disclaimer = nv.disclaimer, updatedby = nv.updatedby, updatedTimeStamp = nv.updatedtimestamp FROM new_values nv WHERE m.templateId = nv.templateId AND m.languageId = nv.languageId RETURNING m.* ) INSERT INTO sample (templateId, languageId, templatetitle, disclaimer, createdby,createdtimestamp) SELECT templateId, languageId, templatetitle, disclaimer, createdby ,createdtimestamp FROM new_values WHERE NOT EXISTS ( SELECT 1 FROM upsert up WHERE up.templateId = new_values.templateId AND up.languageId = new_values.languageId )
Как я могу получить "no of rows affected value", даже если я делаю обновление с одним и тем же запросом
Что я уже пробовал:
Я только что нашел на простом гугле,
RETURNING
вернет no of row affected, но он доступен в приведенном выше запросе.
CHill60
Оба этих запроса идентичны, поэтому нет никакой строки для обновления, следовательно, никакие строки не будут затронуты. Вы утверждаете, что обновление происходит правильно - вы абсолютно уверены, что не используете одни и те же данные?
Во-вторых, действительно ли вам нужно вернуть количество затронутых записей (я не думаю, что возврат m.* - это способ сделать это), или вы просто пытаетесь преодолеть проблему, когда количество записей сообщается как 0?