Sqlite insert into avec des noms uniques, l'obtention de l'id
J'ai une liste de chaînes de caractères à insérer dans une db. Ils DOIVENT être uniques. Lorsque j'insère je voudrais leur ID (pour l'utiliser comme une clé étrangère dans une autre table) donc j'utilise last_insert_rowid. Je reçois 2 problèmes.
- Si j'utilise le remplacer, leurs id
(INTEGER PRIMARY KEY) les mises à jour qui
les sauts de ma db (entrées de point d'
inexistant IDs) - Si j'utilise l'ignorer, rowid est pas mis à jour donc je ne reçois pas le bon ID
Comment puis-je obtenir leurs papiers d'identité? si je n'ai pas besoin de je ne le voulez utiliser une instruction select pour vérifier et insérer la chaîne si elle n'existent pas . Comment dois-je faire cela?
OriginalL'auteur | 2009-05-10
Vous devez vous connecter pour publier un commentaire.
Lorsqu'une violation de contrainte d'unicité se produit, le remplacement de l'algorithme supprime les lignes pré-existantes qui sont à l'origine de la violation de la contrainte avant l'insertion ou la mise à jour de la ligne actuelle et la commande continue à exécuter normalement. Cela provoque le rowid pour le changement et crée le problème suivant
Le contourner est de modifier la définition de la colonne c2 comme suit
et à supprimer "ou de remplacer" clause de vos inserts;
puis quand le test après votre insertion, vous devrez exécuter la requête sql suivante:
select last_insert_rowid(), changes();
La valeur de retour de changements après la 3ème insertion sera une notification à votre application que vous devez à la recherche de la rowid de "test 1", car il était déjà sur le dossier. Bien sûr, si c'est un système multi-utilisateur, vous aurez besoin d'envelopper le tout dans une transaction.
insert or replace into b values (1,'test-1');
je ne peux pas savoir à propos de (1), val -) j'ai donc utilisé la valeur null à la place. J'obtiens les mêmes résultats si j'essaieinsert or replace into b (c2) values(val)
etinsert or replace into b (c2) select val
avec les mêmes résultats. Voici une image (pourquoi ne puis-je pas copier/coller dans/à partir de sqlite-shell!) i.imgur.com/2a6IY.pngsuivez édité en réponse:
hmm, j'ai donc vérifier les modifications et si sa 1-je utiliser le rowid, sinon j'ai besoin d'une instruction select. Il ressemble beaucoup à ma réponse ci-dessous. Ok c'est une solution acceptable, +1. Je vais la réponse actuelle comme l'accepter parce que je l'ai testé sous mysql avec succès.
vous savez que que "accepté" la réponse n'a pas réellement répondu à votre question sur l'élimination de l'instruction select quand il n'est pas nécessaire;
OriginalL'auteur Noah
J'utilise le ci-dessous actuellement
OriginalL'auteur
Par "ils DOIVENT être uniques", font-ils dire que vous êtes sûr qu'ils sont, ou que vous souhaitez une erreur en tant que résultat, si elles ne sont pas? Si vous venez de faire la chaîne elle-même une clé dans une table, puis je ne comprends pas comment le 1 ou le 2 pourrait être un problème, vous recevrez un message d'erreur tel que désiré en cas de non désirés, la duplication, sinon l'ID correct. Peut-être que vous pouvez préciser votre question avec un petit exemple de code SQL que vous utilisez, la table en question, ce comportement que vous observez, et ce comportement que vous voulez à la place...?
Édité: merci pour le modifier, mais c'est pas encore clair pour moi ce que SQL est de vous donner ce que les problèmes!!! Si votre table est livré, par exemple, de:
alors toute tentative d'INSÉRER un double mot sera un échec (le
ABORT
mot clé est facultatif, la valeur par défaut pourUNIQUE
) -- ce n'est pas ce que vous voulez étant donné que vous prononcez les mots "DOIT être unique", c'est à dire, c'est une erreur si elles ne le sont pas?OriginalL'auteur Alex Martelli