2 votes

Est-ce que INSERT ON CONFLICT UPDATE à partir d'une requête WITH est possible dans postgresql 9.5 ?

J'essaie d'insérer (ou de mettre à jour en cas de conflit) des lignes à partir de CTE mais j'ai du mal à trouver la bonne syntaxe pour cela. La table dans laquelle j'insère des lignes ressemble à ceci (simplifié pour des raisons de clarté)

        Column        |           Type           |                            Modifiers
----------------------+--------------------------+------------------------------------------------------------------
 id                   | integer                  | not null default nextval('"QuestionStatistic_id_seq"'::regclass)
 questionId           | integer                  |
 count                | integer                  | not null default 0
Indexes:
    "QuestionStatistic_pkey" PRIMARY KEY, btree (id)
    "QuestionStatistic_questionId_key" UNIQUE CONSTRAINT, btree ("questionId")

Voici ma question :

with "Statistic" as (
   select "questionId", "count" from "SomeTable"
)
INSERT INTO "QuestionStatistic" ("questionId", "count") SELECT "questionId", "count" FROM "Statistics" 
ON CONFLICT ("questionId") DO UPDATE SET "count" = "Statistics"."count"

ce qui me donne ERROR: missing FROM-clause entry for table "Statistics" sur SET "count" = "Statistics"."count" partie. J'ai également essayé d'ajouter FROM à la clause de mise à jour, mais j'ai obtenu ce qui suit ERROR: syntax error at or near "FROM" . Existe-t-il un moyen de faire fonctionner INSERT ON CONFLICT UPDATE avec CTE ?

4voto

Vao Tsun Points 25992

https://www.postgresql.org/docs/9.5/static/sql-insert.html

El SET y WHERE clauses dans ON CONFLICT DO UPDATE ont accès à la ligne existante à l'aide du nom de la table (ou d'un alias), et aux lignes proposées pour l'insertion à l'aide de la fonction spéciale excluded table.

essayez donc :

with "Statistic" as (
   select "questionId", "count" from "SomeTable"
)
INSERT INTO "QuestionStatistic" ("questionId", "count")
SELECT "questionId", "count" FROM "Statistics" 
ON CONFLICT ("questionId") DO UPDATE 
SET "count" = excluded."count"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X