King Fisher Ответов: 0

При обновлении записей запрос не возвращает “нет затронутых строк”


Я написал запрос, который будет проверять наличие записи, если условие истинно, он будет обновляться, иначе он вставит новую запись. Проблема в том, что при вставке он возвращается 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?

0 Ответов