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 :

Comment verifier le nombres de lignes d'un tableau avant INSERT


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Comment verifier le nombres de lignes d'un tableau avant INSERT
    Salut
    Comment puis je faire pour vérifier le nombres de lignes presentes dans une table avant d'en rajouter une?
    Je m'explique.
    Une classe pouvant contenir un maximum de 20 élèves comment puis je faire le test et renvoyer un message d'erreur en cas d'erreur bien sûr !!
    et sinon de permettre l'ajout ou la mise a jour de la table.
    Je travaille sous SQL Server 2000.
    Merci de votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    gérez plutôt cela par un trigger. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER E_LIMITE_N_LIGNE
    ON MaTable
    FOR INSERT
    AS
     
    IF EXISTS(SELECT 1
              FROM   MaTable
              HAVING COUNT(*) > 20)
       ROLLBACK
     
    GO
    Dès lors il sera jamais possible de rentrer plus de 20 lignes dans cette table.
    Si votre table à un n° de classe alors prévoyez un groupage sur ce n° de classe.
    Enfin si vous voulez rendre cette limite variable, alors ajoutez une table des limites par classe.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE T_CLASSE_LIMITE_CLM
    (CLM_CLASSE    INT NOT NULL PRIMARY KEY,
     CLM_MAX_ELEVE INT NOT NULL)
     
     
    CREATE TRIGGER E_LIMITE_N_LIGNE
    ON MaTable
    FOR INSERT
    AS
     
    IF EXISTS(SELECT 1
              FROM   MaTable T
              HAVING COUNT(*) > (SELECT CLM_MAX_ELEVE
                                 FROM   T_CLASSE_LIMITE_CLM
                                 WHERE  CLM_CLASSE = T.CLM_CLASSE))
       ROLLBACK
     
    GO
    A +

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    merci de votre réponse qui me convient.
    cette solution est elle aussi interressante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create trigger NB_ELV_MAX
    on eleves 
    for insert as
    declare @nb int
    select @nb=count(e.code_cls) 
       from eleve e join inserted i on e.code_cls=i.code_cls
    if (@nb>20)
      begin
         raiserror('Pas plus de 20 élèves par classe', 16,1)
         rollback
      end

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Cette solution ne marche pas. En effet imaginez que vous être au 20e et que vous tentez d'en ajouter un, alors le filtre sur inserted qui ne contient que la ligne que vous insérez actuellement fera que la jointure ne contiendra qu'une seule ligne et le cout sera de 1 !

    Il faut donc toujours compter toutes les lignes de la table.

    Ensuite placez votre rollback avant le raiserror. En effet plus tôt vous terminerez votre transaction, plus vous minimiserez les temps de verouillage, plus votre base sera fluide.

    A +

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci en effet ca fonctionne mieux de votre façon
    A+

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

Discussions similaires

  1. [Outils] Comment compter le nombre de lignes ?
    Par ChristopheOce dans le forum EDI/Outils
    Réponses: 3
    Dernier message: 18/04/2011, 13h36
  2. [Vb.Net] Comment obtenir le nombre de ligne(s) d'un DataGrid ?
    Par dinbougre dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2007, 13h25
  3. Réponses: 10
    Dernier message: 06/07/2006, 11h29
  4. Réponses: 2
    Dernier message: 13/06/2006, 16h46
  5. Réponses: 4
    Dernier message: 06/05/2006, 00h52

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