IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Utiliser UPDATE + SELECT pour faire un cache FIFO


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 39
    Points : 22
    Points
    22
    Par défaut Utiliser UPDATE + SELECT pour faire un cache FIFO
    Bonjour, c'est la première fois que je poste sur ce joli site

    Alors voilà, j'ai une bête question de syntaxe en SQL.

    J'ai une table avec deux champs (string url, date date), qui contiennent... des url et des dates

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ma_table>
     
    url			date
    -------------------------------------------
    http://host/url_1.wav	14/05/2008 15:20:39
    http://host/url_2.wav	15/05/2008 20:30:43
    http://host/url_3.wav	16/05/2008 10:55:12
    ...
    J'ai une fonction avec laquelle j'insére de nouvelles lignes (une à une) dans cette table, le champ date étant renseigné par la date d'insertion. J'ai donc écrit une requête 'INSERT INTO <ma_table> bla bla' qui semble marcher très bien, là n'est pas le problème.

    Ce que je veux, c'est en faire une sorte de cache FIFO. C'est-à dire que si le nombre de lignes de la tables atteint un certain seuil, alors je remplace la ligne la plus ancienne au lieu d'insérer une nouvelle ligne. J'ai donc écrit la requête suivante, dont la syntaxe me semblait correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE <ma_table>
      SET url = '<mon_url>', date = DateTime.Now
        WHERE date = (SELECT MIN(date) FROM <ma_table>)
    Ca me retourne l'exception suivante (C#):
    ERROR [42000] [Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe dans l'instruction UPDATE.
    Je cherche à savoir pourquoi. J'ai fait quelques tests, et apparemment ça viendrait du fait que date est à la fois dans SET et dans WHERE. Je vois pour le moment deux solutions sales-mais-qui-devraient-marcher-en-attendant-mieux, en faisant 2 requêtes :
    - updater l'url, puis updater la date
    - supprimer la ligne, puis en insérer une autre
    Mais j'aimerais avoir une solution plus propre. Je débute en SQL, donc vos conseils sont la bienvenue...

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Tu travailles sur quel SGBD en quelle version ?

    Je pense qu'un Trigger sur l'événement INSERT pourrait résoudre ton problème. Tu dois faire la chose en deux à trois requêtes :
    - compter le nombre d'enregistrements
    - s'il est égal au nombre de lignes max alors supprimer la plus ancienne
    - insérer ton nouvel enregistrement
    Je pense qu'il faut englober ces requêtes dans une transaction.

    Maintenant, si les Triggers ne sont pas dispo sur ton SGBD c'est le programme client qui doit faire ces deux/trois requêtes.

    Il y a peut-être d'autres solutions...

    Cordialement

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Salut,

    J'utilise Access 2003, par contre je ne savais pas ce qu'était un trigger. J'ai jeté un oeil, et je pense avoir à peu près compris le principe mais je ne suis pas sûr de savoir l'appliquer.

    Si j'ai bien compris, ça aurait ce genre de tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create trigger fifo_limit after insert on <ma_table>
    begin
        delete from <ma_table>
        where ...
    end;
    avec à la place du ... un code approprié pour préciser que :
    - je supprime la ligne avec la valeur date la plus ancienne
    - et ce ssi le nombre de lignes dépasse mon nombre seuil (je ne sais pas encore très bien comment je vais faire)

    Pour resituer le contexte (je sais pas si ça aide, mais au cas où), je travaille sur une appli en C#, dans laquelle une action sur un bouton fait appel à un webservice. Ce webservice effectue les requêtes avec la classe OdbcConnection.
    Je précise aussi que je ne touche pas des masses en C#, j'ai commencé il y a 4 jours pour le boulot.

    Pour l'instant, j'utilise une table que j'ai créée sous Access puis placée dans l'ODBC via le panneau de configuration. Donc l'appli elle-même ne crée pas la table, pour le moment elle ne fait que des requêtes select, insert et update dessus.

    Dans ce contexte, je ne sais pas où je devrais exécuter la requête du trigger.

    Voilà, désolé de faire une grosse tartine à chaque post mais j'essaie de balancer un max d'infos sur mon contexte pour faciliter la vie à ceux qui pourraient m'aider

    Merci d'avance.

  4. #4
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Ok, donc tu dois gérer ça en C#.
    1) Connaître le nombre de lignes dans le Dataset
    2) Supprimer du Dataset la ligne la plus ancienne si le nombre est égal à la valeur max
    3) Insérer la nouvelle ligne
    Le tout en utilisant un DataAdapter par exemple.

    +++

  5. #5
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    N'utilisez pas des mots reservés pour le nommage de vos colonnes (date).
    Cela ne peut que vous apporter des ennuis.
    Access ne gere pas les triggers.

    Bon courage

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Merci pour vos réponses. Effectivement ce n'était pas très malin de ma part de donner des noms réservés aux champs de la table

    Finalement j'ai préféré faire au plus simple, la solution que j'ai utilisée n'utilise pas DataAdapter, mais fait à peu près la même chose que la celle que elbj m'a proposé :

    - Avant d'insérer quoi que ce soit, compter le nombre de lignes dans la table
    - Si la table est pleine, supprimer une ligne
    - Enfin, si la suppression s'est bien passée, insérer ma ligne

    Finalement ce n'est pas si grave si je n'ai pas une solution si propre que ça...

    Merci à tous, pour ma part mon problème est résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete select pour faire un Update
    Par tralala2 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/10/2009, 16h11
  2. utiliser un Formulaire pour faire un état
    Par girl257 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/09/2007, 19h13
  3. utilisation du TChart pour faire des graphiques
    Par tchimou dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/04/2007, 14h59
  4. utiliser données texte pour faire des calculs
    Par sarah67 dans le forum Access
    Réponses: 20
    Dernier message: 06/02/2006, 14h09
  5. utilisation de select() pour faire un Tchat
    Par innosang dans le forum Réseau
    Réponses: 30
    Dernier message: 09/11/2005, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo