Comment le faire correctement upsert dans postgres 9.5
syntaxe correcte de upsert avec postgresql 9.5, requête ci-dessous montre column reference "gallery_id" is ambiguous
erreur , pourquoi?
var dbQuery = `INSERT INTO category_gallery (
category_id, gallery_id, create_date, create_by_user_id
) VALUES ($1, $2, $3, $4)
ON CONFLICT (category_id)
DO UPDATE SET
category_id = $1,
last_modified_date = $3,
last_modified_by_user_id = $4
WHERE gallery_id = $2`;
J'ai essayé de changer WHERE gallery_id = $2;
à WHERE category_gallery.gallery_id = $2;
puis d'erreur s'affiche there is no unique or exclusion constraint matching the ON CONFLICT specification
, mais je ne veux pas définir gallery_id ou category_id comme unique parce que je veux que les deux colonnes sont les mêmes, puis faire la mise à jour....
Comment le faire correctement upsert dans postgres 9.5?
si ON CONFLICT
besoin colonne unique, dois-je utiliser une autre méthode, comment?
Je veux assurer à plusieurs colonnes à la fois des conflits, puis faire la mise à jour, qu'est-ce que l'utilisation correcte
var dbQuery = `INSERT INTO category_gallery (
category_id, gallery_id, create_date, create_by_user_id
) VALUES ($1, $2, $3, $4)
ON CONFLICT (category_id, gallery_id)
DO UPDATE SET
category_id = $1,
last_modified_date = $3,
last_modified_by_user_id = $4
WHERE gallery_id = $2`;
var dbQuery = `INSERT INTO category_gallery (
category_id, gallery_id, create_date, create_by_user_id
) VALUES ($1, $2, $3, $4)
ON CONFLICT (category_id AND gallery_id)
DO UPDATE SET
category_id = $1,
last_modified_date = $3,
last_modified_by_user_id = $4
WHERE gallery_id = $2`;
table (category_id , gallery_id pas unique colonne)
category_id | gallery_id | create_date | create_by_user_id | last_modified_date | last_modified_by_user_id
1 | 1 | ...
1 | 2 | ...
2 | 2 | ...
1 | 3 | ...
OriginalL'auteur user1575921 | 2016-04-22
Vous devez vous connecter pour publier un commentaire.
La
ON CONFLICT
construire nécessite uneUNIQUE
contrainte à travailler. À partir de la documentation surINSERT .. SUR les CONFLITS
l'article:Maintenant, la question n'est pas très clair, mais vous avez probablement besoin d'un
UNIQUE
de contrainte sur les 2 colonnes:(category_id, gallery_id)
.Si la ligne pour être inséré correspond les deux valeurs avec une ligne déjà sur la table, au lieu de
INSERT
, faire unUPDATE
:Vous pouvez utiliser les colonnes de la contrainte UNIQUE:
ou le nom de la contrainte:
wow, merci! J'ai mal compris, je vais essayer maintenant
oui si il existe déjà
category_id=1 and gallery_id=3
puis mise à jour, insérez pas. J'utilise votre script, si je veux mettre à jourcategory_id = 2 where gallery_id = 3
pas de travail. ou devrais-je ajouter un autre script de mise à jour ?J'ai aussi essayé cette
INSERT INTO category_gallery ( category_id, gallery_id, create_date, create_by_user_id ) VALUES ($1, $2, $3, $4) ON CONFLICT (category_id, gallery_id) DO UPDATE SET category_id = $1, last_modified_date = EXCLUDED.create_date, last_modified_by_user_id = EXCLUDED.create_by_user_id WHERE category_gallery.gallery_id = $2
Je n'ai pas suivi ce que tu veux dire avec
update category_id = 2 where gallery_id = 3
. Voulez-vous insérer/mettre à jour une ligne aveccategory_id = 2 and gallery_id = 3
? Je n'ai pas deWHERE
n'importe où dans mon script.OriginalL'auteur
Comme alternative simplifiée à actuellement accepté de répondre à, le
UNIQUE
contrainte peut être anonyme a ajouté lors de la création de la table:Ensuite, le upsert requête devient (similaire à ce qui a été déjà répondu):
OriginalL'auteur