12
votes

SQLite: possible de mettre à jour la ligne ou insérer si cela n'existe pas?

Je suis sûr que je peux vérifier si une ligne existe en le sélectionnant mais je me demande s'il y a une manière slicker que je ne suis tout simplement pas au courant - semble être une tâche suffisante courante qu'il pourrait y avoir. Cette table SQLite ressemble à ceci comme suit:

SELECT * where QID = 'axo' and ANID = 3;


0 commentaires

4 Réponses :


4
votes

Vous pouvez utiliser la commande Remplacer. Docs


1 commentaires

Mais cela mettra à jour la valeur rowid : Mail-archive.com/sqlite-utilisateurs@sqlite.org/msg24621.html



10
votes

Le INSERT Détails de la documentation A Remplacer l'option

Row: axo - 1 - 45
Row: axo - 2 - 500
Row: axo - 10 - 500


1 commentaires

Autant que je sois capable de déterminer à partir des documents et des tests, la clause WHERE n'est pas une prise en charge de l'insertion ou de la remplacement.



1
votes

Dans cette situation particulière, il s'avère qu'il n'y a pas de solution facile - du moins pas que j'ai été capable de trouver, malgré les efforts de la marque pour le suggérer.

La solution que j'ai fini par utiliser pourrait fournir Utile à quelqu'un d'autre alors je le pose ici.

J'ai défini une clé primaire multi-colonnes comme qid + anid et tente d'insérer dans la table. Si cette combinaison particulière existe, il produira un code d'erreur de 23000 que je puisse ensuite utiliser un indicateur qu'il devrait être une mise à jour. Voici le gist de base (en PHP): xxx

Le code réel que j'ai utilisé est un peu plus complexe à l'aide de préparer / des espaces réservés et de la manipulation de l'erreur si le code n'est pas 23000, etc.


1 commentaires

Êtes-vous sûr de déclarer la clé principale correctement sur la table? J'ai révisé mon exemple et je ne peux toujours pas reproduire votre problème



15
votes

méfiez-vous : remplacer ne "mettre à jour pas vraiment" la mise à jour ou l'insertion "... Remplacer remplace la ligne entière. Par conséquent, si vous ne spécifiez pas de valeurs pour chaque colonne, vous remplacerez les colonnes non spécifiées par NULL ou les valeurs par défaut.

Dans un exemple simple, tel que ci-dessus, c'est probablement bien, mais si vous entrez dans l'habitude d'utiliser Remplacer sous 'Update ou Insérer', vous avez NUKE Data lorsque vous oubliez de spécifier une valeur pour chaque champ ... Juste un avertissement de l'expérience.


0 commentaires