Donné:
CREATE TABLE A (
PK_A INT8 NOT NULL,
A INT8,
PRIMARY KEY (PK_A)
);
CREATE TABLE B (
PK_B INT8 NOT NULL,
B INT8,
PRIMARY KEY (PK_B)
);
Cette requête:
insert into table_b (pk_b, b)
select pk_a,a from table_a
on conflict (b) do update set b=a;
provoque l'erreur suivante:
ERROR: column "a" does not exist LINE 1: ...elect pk_a,a from table_a on conflict (b) do update set b=a; ^ HINT: There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query.
Comment faire la mise à jour en se référant au contenu de table_a
?
postgresql
postgresql-9.5
upsert
Tony Indrali
la source
la source
CREATE TABLE A...
crée une tablea
, nontable_a
.do update set b = a;
ne peut pas trouver "a" car il fait référence au tableau "b" et non à la sous-requête, essayezdo update set b = (select a from a);
Réponses:
Problèmes multiples.
Votre configuration, étendue:
Cela marche:
Résultat:
Les problèmes
Vous êtes déroutant
table_a
etA
dans votre démo (comme l' a commenté @Abelisto ).L'utilisation d'identificateurs légaux, minuscules et non cotés aide à éviter toute confusion.
Comme @Ziggy l'a mentionné ,
ON CONFLICT
ne fonctionne que pour les violations réelles de contraintes uniques ou d'exclusion . Le manuel:Par conséquent,
ne peut pas fonctionner, aucune contrainte là-bas.ON CONFLICT (b)
ON CONFLICT (pk_b)
travaux.Comme @Ziggy l'a également mentionné , les noms des tables source ne sont pas visibles dans la
UPDATE
pièce. Le manuel:Accentuation sur moi.
Vous ne pouvez pas non plus utiliser les noms de colonne de la table source dans la
UPDATE
pièce. Il doit s'agir des noms de colonne de la ligne cible . Vous voulez donc vraiment:Le manuel une fois de plus:
la source
b = excluded.a
ça ne marche pas, c'était un peu caché dans le Docu officiel.Lorsque vous effectuez des upserts dans PostgreSQL 9.5+, vous devez vous référer aux données exclues (celles qui n'ont pas pu être insérées) par l'alias
excluded
. De plus, l'on conflict
option doit faire référence à la clé:(pk_b)
plutôt qu'à(b)
. Par exemple.Pour plus d'informations, reportez-vous à la documentation officielle ou à cette introduction facile à upsert .
la source