Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arrangement Auto de l'ID des lignes d'une BD

Sujet résolu
27 mars 2015 à 18:07:49

Bonsoir à tous,

Alors voilà ce sur quoi je butte >_<:

Je crée des lignes dans ma base de données et il se peut que je décide par le biais du php d'en éliminer une.

HIC ! À ce moment là, je me retrouve avec une liste d'ID du genre : 1, 2, 3, 5, 6, ... :o

Ceci me cause des soucis pour l'analyse des lignes de la BD par ma page php. Adapter un code à ça serait impossible en imaginant que je puisse supprimer plusieurs lignes consécutives ce qui générerait un énorme GAP entre un ID et un Autre.

S'il ne tenait qu'à afficher dans un certain ordre les lignes, ça va, mais je soucis c'est que je veux pouvoir déplacer ces lignes. Autrement dit, qu'une ligne d'ID 2 passe à 3 et donc que la 3 passe à 2. 

Si après suppression de plusieurs lignes je me retrouve avec un séquence comme : 1, 2, 5, 6, 8, ... et que je veux faire passer ma ligne 3 en position 2, il me faudra faire la manipulation (ID-1) à trois reprises ou plus si la séquence présente un trou plus grand encore :waw:. Une fois ça va mais si je veux par la suite passer la ligne 4 à la ligne 3 et la 3 à la ligne 4 j'aurais encore le même soucis et ainsi de suite...

Alors voilà : Est-il possible de faire en sorte que la BD range et ré-arrange les ID automatiquement :magicien: de sorte à ce que les valeurs se suivent ?

Si ce n'est pas possible, que pourriez-vous me conseillez-vous de faire pour palier à ce soucis ?

Merci d'avance pour votre aide. 

Believe94

-
Edité par Believe094 27 mars 2015 à 18:13:19

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2015 à 18:12:40

Bonsoir, :)

Si je ne me trompe pas, il y a un bouton dans PHPMyAdmin qui permet de faire cela, mais je ne me rappel plus comment il s'appelle, je vais aller voir et je te tient informé si je le retrouve...

Edit : Non testé

La section "Ordonner la table par " tu sélectionne ton ID. puis croissant et tu valide.

Tu as également la case "AUTO_INCREMENT" un peu plus bas qui contrôle la prochaine valeur de ton ID, a la prochaine incrémentation.

En espérant avoir pu t'aider. ^^

Edit 2 : Après test, cela arrange la table dans l'ordre croissant, mais ca ne remplit pas les "trous" des ID. Désolé.

-
Edité par AnthonyMew 27 mars 2015 à 18:22:24

  • Partager sur Facebook
  • Partager sur Twitter

Il existe 10 types de personnes dans le monde, ceux qui comprennent le binaire... et les autres !

27 mars 2015 à 18:32:38

Re,

Effectivement, je viens de tester de mon côté et je me disais la même chose.

Je pense peut-être que c'est quelque chose que je devrais faire manuellement (Comment je sais pas encore ^^ mais je trouverais sur le net).

Quelque chose dans le genre lecture des lignes par ordre croissant, et incrémentation d'une variable appart et lorsque l'id de la ligne ne correspond pas à la variable, changer l'ID.

Mais après l'AI ne se mettrait pas à jour et continuerait à partir d'une valeur qui sera loin de la valeur adéquat.

Je guette toujours si quelqu'un aurait une option mystère ^^

Merci pour ton temps AnthonyMew.

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2015 à 18:38:13

Bonjour,

Essayer de maîtriser la numérotation d'une clé primaire d'une table n'est pas une bonne chose ... La clé primaire n'est pas là pour représenter un ordre une une information, mais UNIQUEMENT pour assurer l'unicité d'un enregistrement et sa référence éventuelle dans d'autres tables (clé étrangère).

Si tu as besoin de gérer un ordre, comme cela semble être le cas, alors l'ajout d'une colonne ordre ou la gestion d'un id_precedent me paraît plus approprié ...

A dispo pour en parler :)

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 mars 2015 à 18:48:44

Re,

Alors j'en suis conscient, et pour preuve, j'avais déjà crée une colonne pour l'Ordre :

Mais au final, modifier la colonne ID ou ORDRE, en ce qui me concerne ne change rien. J'ai parler d'ID pour que ce soit plus facile de visualiser ce que je voulais faire.

Après, est-ce qu'il existe une option que ne devrait pas s'appliquer à une clé primaire que l'on pourrait appliquer à une colonne normale ?

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2015 à 18:59:10

Quel est ton besoin au final ?

Si aujourd'hui tu fais :

SELECT ID, TITRE FROM TA_TABLE ORDER BY ID ASC;

Tu vas récupérer tes enregistrements dans l'ordre que tu veux non ?

Si au lieu d'afficher 2, 6, 18, 55, 105 (car plusieurs enregistrements ont été supprimés) tu veux afficher 1,2,3,4,5, alors pourquoi ne pas gérer cela à l'affichage (en PHP par exemple) ?

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 mars 2015 à 19:12:29

Je ne peux pas faire comme cela car ce n'est pas juste de l'affichage en fait.

Je dois rafraîchir une page qui va chercher le contenu de la BD à chaque fois.

Je veux pouvoir modifier l'ordre des lignes mais comme je vais les chercher à chaque fois dans la base de données par le refresh, si elles ne sont pas rangées selon une colonne de la BD, elle ne changeront pas d'ordre à l'affichage.

Or, si j'ai une suite comme 2, 6, 18, 55 et que je veux que ma ligne 55 soit définie comme étant avant la ligne 3 (correspondant au 18), il faudrait ramener ce 55 à 17.

Maintenant, ma page php elle ferait ORDRE -1 (et la ligne qui correspond à ORDRE - 1, attribuer ORDRE = ORDRE + 1) à chaque clique/Refresh donc il me faudrait un max de click avant d'arriver à 17.

Tandis que si (Exemple) je peux faire qu'une colonne s'écrive dynamiquement en l'associant au nº de la ligne de la table de la BD, alors mon problème serait réglé.

En fait, s'il pouvait exister une colonne type ROWNUM qui est établie par MySQL et que l'on puisse modifier, je n'aurais plus de soucis.

Cependant, il semblerait que MySQL soit le seul à ne pas avoir ce ROWNUM.

-
Edité par Believe094 27 mars 2015 à 19:24:18

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2015 à 19:25:42

Et qu'est-ce qui t'empêches d'utiliser la colonne ORDRE alors ?

Lorsque l'utilisateur (ou toi) change l'ordre côté applicatif (bouton ? drag and drop ?), tu mets à jour la colonne ORDRE en base ...

Ainsi, lors du refresh tu appelles les enregistrements ORDER BY ORDRE ... non ?

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 mars 2015 à 19:39:29

Et bien je peux mettre à jour la colonne ORDRE en base mais ce que je ne sais pas c'est comment, pour faire en sorte de respecter l'ordre que je souhaite, en omettant les trous qu'ils peut y avoir dû à la suppression d'une ou plusieurs autres lignes.

Actuellement, j'ai à chaque ligne affichée sur ma page php dans une tableau une colonne dans laquelle se trouve deux boutons : 

1- Monter

2- Descendre

S'il n'y a pas de trous, c'est ok. En appuyant sur monter à la ligne 3, j'actualise ma base de données de la sorte : 

valeur de ORDRE de la ligne 3-1 = 999;

valeur de ORDRE de la ligne 3 = 2; 

valeur de la ligne 999 = 3;

Mais si j'ai des trous, ça donne cela : On va dire Monter la ligne 3 d'ORDRE 17 à la ligne 2 d'ORDRE 12.

Valeur de ORDRE de la ligne 17-1 = 999

valeur de ORDRE de la ligne 17 = 17-1;

valeur de la ligne 999 = 17;

Ok... en fait ça fonctionnerait U_U mais après aucune suite logique dans tous les nombres. Mais ça je m'en fous un peu vu que je ne les affiche pas.

 EDIT1: Il y a bien un soucis qui est que la ligne 17-1 n'existe pas.

Bon et bien je tente comme ça pour voir. Je reviens vers vous si quelque chose ne va pas ou si tout va bien ^^

Merci à tous !

-
Edité par Believe094 27 mars 2015 à 19:57:31

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2015 à 19:46:58

Tu affectes un ordre à tes lignes en base par la colonne ORDRE.

Lorsque tu récupères tes lignes tu les ordonnes ORDER BY ORDER. Tu les affiches en PHP en stockant cet ordre dans chaque ligne.

Lorsque tu cliques sur le bouton "monter" ou "descendre" tu exécutes un UPDATE pour mettre à jour ORDRE en base pour chaque ligne ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 mars 2015 à 20:07:19

Je vais essayer de faire comme tu me suggères.

Je reviendrais si besoin.

Entre temps, existe t'il une commande pour mettre à jour toutes les colonnes d'une même table ?

Suffit-il d'utiliser quelque chose dans le genre :

$req = $db->query('UPDATE ORDRE WHERE table = 'nom_de_la_table');

while ($donnees = $req->fetch())
{...}

??

-
Edité par Believe094 27 mars 2015 à 20:08:58

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2015 à 20:55:47

Bon alors j'ai combiné ce que ta proposition Benzouye avec une autre méthode. À savoir :

À chaque ajout/suppression d'une nouvelle ligne, j'actualise les valeurs contenues dans la colonne ORDRE avec ceci :

$db = mysqli_connect (''.$host.'', ''.$user.'', ''.$password.'');
mysqli_set_charset($db, "utf8");
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql4 ='SET @count = 0';
$sql5 = 'UPDATE `table` SET `table`.`colonne` = @count:= @count + 1';

mysqli_query($db, $sql4) or die('Erreur SQL !'.$sql4.'<br />'.mysqli_error($db));
mysqli_query($db, $sql5) or die('Erreur SQL !'.$sql5.'<br />'.mysqli_error($db));

mysqli_close($db);

Voilà, en espérant que ceci puisse aider d'autres personnes !

Merci à tous pour votre aide !!

Cordialement,

Believe94.

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2015 à 17:47:11

Oui mais dans ce cas, pas de permutation possible ... Ce n'est pas ce que tu voulais faire ? Changer l'ordre ?
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL