J'utilise Python pour écrire dans une base de données Postgres :
sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)
Mais comme certaines de mes lignes sont identiques, j'obtiens l'erreur suivante :
psycopg2.IntegrityError: duplicate key value
violates unique constraint "hundred_pkey"
Comment puis-je écrire une instruction SQL "INSERT sauf si cette ligne existe déjà" ?
J'ai vu des déclarations complexes comme celle-ci recommandées :
IF EXISTS (SELECT * FROM invoices WHERE invoiceid = '12345')
UPDATE invoices SET billed = 'TRUE' WHERE invoiceid = '12345'
ELSE
INSERT INTO invoices (invoiceid, billed) VALUES ('12345', 'TRUE')
END IF
Mais d'abord, est-ce que c'est trop pour ce dont j'ai besoin, et ensuite, comment puis-je exécuter l'une d'entre elles comme une simple chaîne de caractères ?
79 votes
Quelle que soit la façon dont vous résolvez ce problème, vous ne devriez pas générer votre requête de cette façon. Utilisez des paramètres dans votre requête et passez les valeurs séparément ; voir stackoverflow.com/questions/902408/
3 votes
Pourquoi ne pas attraper l'exception et l'ignorer ?
8 votes
Depuis la version 9.5 de Posgres (actuellement en version bêta 2), il existe une nouvelle fonctionnalité de type upsert : postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT
5 votes
Avez-vous envisagé d'accepter une réponse à ce sujet ? =]
0 votes
@AP257 Pourquoi n'avez-vous pas encore accepté de réponse ? Par exemple, la réponse d'Arie est très utile et a été fortement upvoted.
0 votes
Comment empêcher l'incrémentation de l'id de la clé primaire ?