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

MySQL Discussion :

limiter le nombre de ligne d'un table


Sujet :

MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 87
    Points : 70
    Points
    70
    Par défaut limiter le nombre de ligne d'un table
    Salut,

    je voudrais savoir est ce qu il existe un moyen de limiter le nombre de ligne d'une table, je vous explique :

    je veut que ma table ne contienne que 10 lignes, lorsque je fait des insert 1,2,....,10 , pour le 11eme insert le première ligne sera supprimée ma table contiendra alors 2,3,.....,11 pour le 12eme insert la deuxième ligne sera supprimée ma table contiendra 3,4,....12 et ainsi de suite

    est ce que c'est faisable?

    REMERCIEMENTS...

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je ne vois pas bien l'intérêt de la chose mais c'est possible par programmation. Soit dans l'application qui utilise la BDD, soit par un trigger SQL sur insertion qui supprime la ligne la plus ancienne puis qui insère la nouvelle.

    Un truc de ce genre, à adapter et à tester :
    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
    DELIMITER //
    CREATE TRIGGER tr_ins_suppr_plus_ancienne_ligne BEFORE INSERT ON la_table  
    FOR EACH ROW
    BEGIN
    	DELETE FROM la_table
    	WHERE id = 
    	(
    		SELECT MIN(id)
    		FROM la_table
    	);
     
    	INSERT INTO la_table(les_colonnes_de_la_table)
    	VALUES(NEW.les_colonnes_de_la_table);
    END;
    DELIMITER ;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 87
    Points : 70
    Points
    70
    Par défaut
    j'ai essayé de faire ceci apres la requete d'insertion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php 
    	$req=$bdd->query('DELETE FROM '.$_GET['RFID'].' WHERE N=(SELECT MIN(N) FROM '.$_GET['RFID'].')');
    	$req->closeCursor();	?>
    mais il m'affiche un message d'erreur :

    you can't spécify target table 'nom_de_la_table' for update in from

    que faire?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ah oui, j'avais déjà été confronté à ce problème ! MySQMerde dans ses oeuvres !

    Alors le trigger est probablement la meilleure solution parce que ça se passe dans une transaction qui bloque la table. Un truc du genre :
    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
    19
    20
    DELIMITER //
    CREATE TRIGGER tr_ins_suppr_plus_ancienne_ligne BEFORE INSERT ON la_table  
    FOR EACH ROW
    BEGIN
     
    	DECLARE i INTEGER;
     
    	i := 
    	(
    		SELECT MIN(id)
    		FROM la_table
    	);
     
    	DELETE FROM la_table
    	WHERE id = @i;
     
    	INSERT INTO la_table(les_colonnes_de_la_table)
    	VALUES(NEW.les_colonnes_de_la_table);
    END;
    DELIMITER ;
    Pas sûr du tout de la syntaxe mais l'idée est là.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 87
    Points : 70
    Points
    70
    Par défaut
    ça ne marche pas voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE TRIGGER ajouter_effacer BEFORE INSERT ON 1B12908E60BB' at line 1 in C:\wamp\www\site2\traitement_medecin_2_2_ajax.php on line 42
    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
    19
    20
    21
    22
    23
    24
    25
    26
    	<?php
    	$rfid = $_GET['RFID'];
    	$req=$bdd->prepare("
    	DELIMITER //
    	CREATE TRIGGER ajouter_effacer BEFORE INSERT ON $rfid  
    	FOR EACH ROW
    	BEGIN
    		DELETE FROM $rfid  
    		WHERE N = 
    				(
    				SELECT MIN(N)
    				FROM $rfid  
    				)
     
    		INSERT INTO $rfid(RFID,Chambre,Nom,Prenom,Sexe,Age,Taille,Poids,Alergies,Antecedents,Tension,Temperature,Rythme,Glycemie)
     
    		VALUES(NEW.:rfid_,:chambre_,:nom_,:prenom_,:sexe_,:age_,:taille_,:poids_,:allergies_,:antecedents_,:tension_,:temperature_,:rythme_,:glycemie_)
     
    	END//
    	DELIMITER");
     
    	$req->execute( array('rfid_'=>$_GET['RFID'],'chambre_'=>$_GET['CHAMBRE'],'nom_'=>$_GET['NOM'],'prenom_'=>$_GET['PRENOM'],'sexe_'=>$_GET['SEXE'],
    			'age_'=>$_GET['AGE'],'taille_'=>$_GET['TAILLE'],'poids_'=>$_GET['POIDS'],'allergies_'=>$_GET['ALERGIES'],'antecedents_'=>$_GET['ANTECEDENTS'],
    ici line 42		'tension_'=>$_GET['TENSION'],'temperature_'=>$_GET['TEMPERATURE'],'rythme_'=>$_GET['RYTHME'],'glycemie_'=>$_GET['GLYCEMIE']));
    			$req->closeCursor();					
    	?>

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ce que je vous ai donné est le code d'une procédure SQL a enregistrer dans la BDD !

    Si vous voulez faire l'équivalent en PHP, lancez une requête qui bloque la table. Dans la même transaction, faites la première requête qui récupère l'id le plus ancien, puis celle qui supprime la plus ancienne ligne et enfin celle qui insère la nouvelle puis débloquez la table.
    Pas le temps d'expliquer davantage maintenant.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Par ailleurs, avec une table dont le nom commence par le caractère "1", vous n'en n'avez pas fini avec les messages d'erreurs !

    Commencez par donner des noms corrects à vos objets.

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Je suis surpris par la solution donnée par Cinephil, à savoir l'utilisation d'un Trigger pour modifier la table qui est référencer.
    MySql, au travers d'un Trigger n'autorise pas ce genre de bidouille et provoque un message d'erreur.

    La seule solution possible est bien de passer par une procédure stockée, comme ci-après :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    -- ============
    -- Table `test`
    -- ============
     
    DROP TABLE IF EXISTS `test`;
     
    CREATE TABLE `test` (
      `Id`         int          NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `Texte`      VARCHAR(255)     NULL DEFAULT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      AUTO_INCREMENT = 1
      ROW_FORMAT=COMPRESSED;
     
    -- ==================
    -- Procedure `ranger`
    -- ==================
     
    DROP PROCEDURE IF EXISTS ranger;
     
    DELIMITER $$
    CREATE PROCEDURE ranger
    (
    	IN In_Texte varchar(255)
    )
    DETERMINISTIC
    NO SQL
    BEGIN
     	DECLARE nbr, nbr_max, nbr_min INTEGER;
     
    	SELECT max(`Id`), min(`Id`) INTO nbr_max, nbr_min FROM `test`;
     
    	SET nbr = nbr_max - nbr_min;
     
    	IF nbr > 8 THEN
    		DELETE FROM `test` WHERE `Id` = nbr_min;
    	END IF;
     
    	INSERT INTO `test` (`Texte`) VALUES (In_Texte);
    END$$
    DELIMITER ;
    Et voici comme insérer de nouvelles lignes dans la table :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    USE `essai`;
     
    -- =======================
    -- Insertion dans `test`
    -- =======================
     
    call ranger('un');
    call ranger('deux');
    call ranger('trois');
    call ranger('quatre');
    call ranger('cinq');
    call ranger('six');
    call ranger('sept');
    call ranger('huit');
    call ranger('neuf');
    call ranger('dix');
     
    select * from `test`;
     
    call ranger('onze');
    call ranger('douze');
    call ranger('treize');
    call ranger('quatorze');
    call ranger('quinze');
    call ranger('seize');
     
    select * from `test`;
    Comme la question était de se limiter entre nombre de lignes dans mysql, la solution basique est celle que je viens de vous donner.
    Mais normalement, on ne gère pas ce genre de cas en myql mais bien en php, à l'aide d'un indexe qui va toujours pointer sur le dernière ligne insérée.

    Du coup, on gère en php une rotation en passant de 1, 2, 3 ... jusqu'à 10, puis à 10, on revient à 1.
    Il y a juste à stocker quelque part cet indexe.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 87
    Points : 70
    Points
    70
    Par défaut
    MERCI pour votre aide

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

Discussions similaires

  1. limiter le nombre des lignes d'une table MYsql
    Par ikrambh dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/08/2013, 15h09
  2. [WD15] Limiter le nombre de lignes d'une table
    Par L.Lemarchand dans le forum WinDev
    Réponses: 4
    Dernier message: 04/06/2010, 20h25
  3. Table temporaire limitée en nombre de lignes
    Par Hobbi1 dans le forum SQL
    Réponses: 3
    Dernier message: 28/04/2010, 10h40
  4. [WD11] Limiter l'affichage du nombre de ligne d'une table par page
    Par labifle dans le forum WinDev
    Réponses: 20
    Dernier message: 19/04/2010, 09h54
  5. [WD7] Limitation du nombre de lignes d'une table
    Par draingea dans le forum WinDev
    Réponses: 5
    Dernier message: 27/03/2009, 14h39

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