• # houlà......

    Posté par  . Évalué à 3.

    suffit d'avoir une clé qui le permet:

    create temporary table A ( z ENUM('0','1','2','3') , numero int, primary key(z) );
  • # Tordu

    Posté par  (site web personnel) . Évalué à 1.

    A priori, je ne vois rien de simple mais je me trompe peut être.

    La première solution qui me vient à l'esprit, c'est un champ numériqe unique non null avec une contrainte check "compris entre 1 et 4".

    Une fois créé les enregistrement comportant les valeurs 1, 2, 3 et 4, il ne te sera plus possible d'inserrer quoi que ce soit d'autre (la clé unique assure qu'on ne réutilise pas deux fois le même numéro et le not null t'oblige à mettre un numéro).
    • [^] # juste une précision sur ce que je souhaite en fait

      Posté par  . Évalué à 1.

      Bonsoir,
      merci beaucoup je me suis mal exprimé, je souhaite par exemple que le 1 ne puisse pas se retrouver plus de 4 fois dans la table, idem pour le 7, le 45...le but étant de limiter les emprunts (cela revient à ça en fait). Sinon je pensais à un trigger qui compte (via une fonction ?) et indique si c'est bon ou pas (mais comme je ne maitrise ni les triggers ni les fonctions en SQL, vive le C ;-) ).
      J'espère que cette information précise mieux le but de ma demande. Merci
      Cordialement
      • [^] # Re: juste une précision sur ce que je souhaite en fait

        Posté par  . Évalué à 1.

        Effectivement, c'était pas clair =)

        Le SQL "pur" est très bien pour gérer des cardinalités de type 0,1, n (pour n quelconque).
        Par contre, c'est pas du tout adapté quand on veut fixer des valeurs de n.

        En SQL "pas pur" ;) faut voir ... quel SGBD utilises-tu ?
      • [^] # Re: juste une précision sur ce que je souhaite en fait

        Posté par  . Évalué à 3.

        Je n'ai pas testé le code mais ça doit être quelque chose dans ce gout là.
        En gros créer un trigger qui compte le nombre d'enregistrements identiques et interromps le commit si nécessaire.
        (la divison par zéro c'est pour MySQL, avec un autre SGBD tu peut lever une erreur proprement)


        CREATE TRIGGER check_limit_4
        BEFORE INSERT ON my_table
        FOR EACH ROW BEGIN

        DECLARE sim_count AS INT;
        SELECT count(*)
        INTO sim_count
        FROM my_table
        WHERE my_field = :new.my_field

        IF sim_count > 3 THEN 1 /0;

        END


        Mais bon si tu maîtrise totalement la partie applicative, je serait toi je ne m'embêterait pas avec du SQL à moins que ce soit critique.
        • [^] # Re: juste une précision sur ce que je souhaite en fait

          Posté par  (site web personnel) . Évalué à 3.

          Sous Oracle, tu risque fort d'avoir des "table mutating" : il est interdit de faire un select sur une table en cours de modification.

          Sous d'autres bases, je pense qu'il est probable d'avoir le même problème mais c'est à vérifier.

          Pour revenir à ma "solution" de départ, pour l'adapter, il suffit de modifier la clé unique pour qu'elle porte sur deux champs : le champ qui numérote de 1 à 4 et l'autre champ.

          Par contre, c'est assez bizarre de vouloir faire cela, ça sonne comme une erreur de conception de ton modèle de base de donnée.
  • # Merci à tous

    Posté par  . Évalué à 1.

    j'utilise posgres mais je veux du code portable j'essaye les triggers. Merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.