9
votes

SQLite: Combinez Select et Supprimer dans une déclaration

J'ai besoin d'exécuter deux déclarations comme: xxx

Je prépare et exécute deux déclarations différentes. Je me demande s'il y a un moyen de le combiner dans une déclaration.

Fondamentalement tout ce que j'ai besoin de faire est d'obtenir une colonne de quantité de la ligne avant qu'elle soit supprimée.


1 commentaires

Je me trompe peut-être mais je ne pense pas que vous puissiez. Ils ne peuvent pas être transformés en un seul changement car la suppression peut supprimer les informations que vous essayez d'obtenir. Cela briserait l'intégrité de la base de données.


4 Réponses :


14
votes

SQLite ne prend pas en charge cette extension à SQL standard - vous devez utiliser les deux instructions, sélectionnez d'abord, supprimez ensuite. Vous pouvez les envelopper dans une transaction, bien sûr, (commencement et commettez des déclarations avant et après garantira que), de garantir l'atomicité et la cohérence.


0 commentaires

-2
votes

Vous pouvez le faire en séparant les deux déclarations avec un point-virgule, par exemple. (Utilisation du port .NET de SQLite):

using (SQLiteConnection conn = new SQLiteConnection("Data Source=fie.db3"))
{
  conn.Open();

  using (var cmd = conn.CreateCommand())
  {
    cmd.CommandText = "SELECT id FROM fies; DELETE FROM fies WHERE id = 5;";
    using (var reader = cmd.ExecuteReader())
    {
      while (reader.Read())
      {
        Console.WriteLine(reader[0]);
      }
    }
  }
}


5 commentaires

Tout cela fera est d'exécuter une déclaration puis l'autre. Cela ne le rend pas atomique. Un autre processus pourrait modifier la base de données entre le Select et le Supprimer. Le seul moyen de se protéger contre cela est de les envelopper dans une transaction.


J'ai essayé la déclaration de combinaison (non transactionnelle) et dirigez-vous dans le gestionnaire SQLITE (un complément à Firefox). Ce que j'avais: "Sélectionnez le montant de la table dans laquelle ID = 5; Supprimer des fies où ID = 5;" commande excitée, la rangée a été supprimée, mais rien n'a été renvoyé du statutrait combiné


Vous avez oublié d'ajouter: Ceci est pour iPhone intégré SQLite - il peut donc s'agir d'une différence avec des déclarations combinées. Peut-il?


Leon: Oui, cela pourrait être une différence de mise en œuvre. Je l'ai testé avec sqlite.net; Cela renvoie définitivement le résultat de la sélection.


Finnw: Alors, enveloppez-les dans une transaction: conn.begintransaction (). Avoir une transaction ne vous empêche pas d'utiliser une instruction SQL combinée.



1
votes

supposant que votre filetage / processus d'appel ait un identifiant unique (par exemple thread_id), je pense i> une approche viable serait d'ajouter un drapeau (dire, "Handlerid") à votre table, ce qui est Définissez sur NULL sur INSERT, puis faites:

update db set handlerid = <my_thread_id> where handlerid is null;
select * from db where handlerid is not null and handlerid = <my_thread_id>;
delete from db where handlerid is not null and handlerid = <my_thread_id>;


0 commentaires

0
votes

Il est tard mais pour le futur visiteur. Dans mon cas, j'ai dit ci-dessous

Je veux supprimer cet identifiant où le montant = 5, donc j'ai fait cela xxx

Donc, dans votre cas, vous devez modifier où l'état comme vous voulez


0 commentaires