8
votes

Make MySQL Auto-Incrément ID (Re) Démarrer de 1

"Big" mise à jour: strong> p>

ok je commençais l'ensemble point d'incrément automatique mal. Je pars Ce serait un moyen plus facile de cibler le premier, deuxième, troisième et si rangée, Mais c'est juste la mauvaise approche. P>

vous devriez plutôt vous soucier de cela le Auto_Increments sont uniques et bien ... qu'ils augmentent. Tu devrais utiliser le pour ça. p>

Je ne supprimerai pas cette question parce que je pense que cela pourrait être utile pour quelqu'un sinon avec la même mauvaise idée, mais Soyez averti! Strong> :) p>


J'ai une table mysql très simple qui est allée comme ceci: p> xxx pré>

puis j'ai supprimé les deux premiers commentaires, le résultat: p>

id    comment    user

1     hola      name3
2     chau      name4
3     xxx       name5


7 commentaires

Ne faites pas, vous aurez perdu des relations avec des rangées de tables pertinentes


Une raison quelconque de l'esthétique?


@Shakti Singh, je ne vois pas de relations ici?


Il n'y a pas besoin de faire cela; Vous ne sauverez pas «espace».


@webarto Il est juste de supposer qu'une clé primaire est une partie où elle est utilisée comme une clé étrangère pour former une relation, je suppose.


@webarto, je suis d'accord Wirh Cularis. Soit la colonne ID est utilisée dans la conception de la base de données, auquel cas les valeurs ont une signification et il s'agit d'une opération impaire à effectuer, ou est redondante et devrait être éliminée.


@CULARIS @FSB Oui, bien sûr, je comprends, mais peut-être qu'il vient de recevoir cette table et veut recourir aux index de sa nouvelle demande. Sinon, il n'y a pas de besoin ni de point pour le régler à nouveau.


10 Réponses :



0
votes

Ce n'est pas le but de Auto_Increment. Il existe de générer des identifiants uniques, de ne pas conserver une séquence irréprochable.

Si vous avez une raison valable pour vouloir cela, génère vous-même les identifiants dans votre code. Auto_incrènement ne fournira pas ceci pour vous.


0 commentaires


-1
votes

Peut-être que c'est votre approche de la solution que vous essayez de réaliser cela n'est pas correcte comme ce que vous essayez de réaliser qu'il n'est pas possible de «automatiquement» et de faire à la main lorsque vous avez des milliers de lignes fera votre décalage système. .

est-il vraiment nécessaire que le système s'ajuste à chaque suppression?


0 commentaires

0
votes

Accentuellement, l'incrément automatique est faite pour que cela augmente, quelle que soit la quantité de lignes là-bas.

ALTER TABLE TABLE TABLE AUTO_INCREMENT = 1 est réinitialisée, mais vous pouvez obtenir de mauvaises choses, si l'identifiant commence à répéter.

Alors, mon avantage serait - laissez-le seul :)


0 commentaires

5
votes

Disclaimer: Je ne peux pas penser à une raison valable de le faire, et cela peut casser des choses très mauvaises. Cependant, j'ajoute cela pour des raisons de complétude et de démonstration.

Vous pouvez utiliser cette solution vraiment laid, veuillez seulement faire cela si vous êtes au point de vue ou que votre chien est tenu en otage! xxx

Ceci réinitialisera tous les identifiants à la position de la rangée dans la table. Veuillez noter que cela réorientera les lignes sur la manière dont MySQL les obtient à partir du moteur de stockage, il n'y a donc aucune garantie sur la commande de quelque manière que ce soit.

Si vous avez un système basé sur les ID (comme relations entre les tables) alors vous serez ... Eh bien, disons que j'espère que vous avez une sauvegarde.


2 commentaires

Merci!! Mais maintenant je vois pourquoi les gens m'avaient averti que c'est laid et jusqu'à ce qu'ils prennent mon chien, je ne l'utiliserai pas :)


Merci de la publier! L'utilisation est la suivante: 1) supprimez les doublons de la table; 2) compact un IA pk. La raison est pour le randomizer basé sur la PK pour fonctionner efficacement.



9
votes

En supposant qu'il n'y ait pas de problèmes clés étrangers à traiter, ce code le fera:

SELECT MAX(ID) + 1 FROM MYTABLE; -- note the output
ALTER TABLE MYTABLE AUTO_INCREMENT = <result from above>;


0 commentaires

-1
votes
 update table_name set id =NULL; alter table table_name change column
 `id` `id` int auto_increment;

1 commentaires

Vous ne pouvez pas définir la colonne de clé primaire sur NULL



2
votes
ALTER TABLE event AUTO_INCREMENT = 1;

0 commentaires

0
votes
    function backup_tables($host, $user, $pass, $dbname, $tables = '*'){

    $connect = mysqli_connect($host, $user, $pass , $dbname);

     mysqli_query($connect, "SET NAMES 'utf8'");


    //get all of the tables
    if($tables == '*'){
        $tables = array();
        $result = mysqli_query($connect, 'SHOW TABLES');
        while($row = mysqli_fetch_row($result))
        {
            $tables[] = $row[0];
        }
    }
    else
    {
        $tables = is_array($tables) ? $tables : explode(',',$tables);
    }

    foreach($tables as $table){
        $table = trim($table);
    // getting all table fields
    $tblDetails = mysqli_query($connect,"SHOW FULL COLUMNS FROM $table");

    // we may need to know how to create our table
    $tblCreate = mysqli_fetch_row(mysqli_query($connect, 'SHOW CREATE TABLE '.$table));

    // getting last line from table creation script in order to get info about engine ->suffix1
    $suffix1 = end(explode(PHP_EOL,$tblCreate[1]));

        // if there is auto increment we have to remove
        if (strpos($suffix1,"AUTO_INCREMENT")){ 
            $tmpArr = explode(" ",$suffix1);
            $newStr = '';
            foreach ($tmpArr as $term){
                if (!is_int(strpos($term, "AUTO_INCREMENT"))) $newStr .= $term . ' '; else $suffix4 = $term; // suffix4 stores next value of auto_increment 
            }
            $suffix1 = $newStr;
        } // now if there is auto_increment we removed from the last line of creation table script


        $return .= "DROP TABLE IF EXISTS `".$table."` CASCADE;\n\n";

     // starting creation table with our rules
        $kgbReturn = "CREATE TABLE `$table` (\n";


        while($cols = mysqli_fetch_row($tblDetails )){

            if ($cols[2]) $cols[2] = " COLLATE " . $cols[2]; //if a charset defined add to line
            if ($cols[3]=='NO') $cols[3] = " NOT NULL"; // if the field may be null 

            $kgbReturn .= "`".$cols[0]."` ".$cols[1]. $cols[2] . $cols[3]. ",\n"; //field creation line ready
        }


        $kgbReturn = rtrim($kgbReturn,",\n") . "\n" .trim($suffix1," ") . ";\n\n"; // table creation without auto_increment


        $tblDetails = mysqli_query($connect,"SHOW FULL COLUMNS FROM $table WHERE (`Key` LIKE 'PRI%')");
        $suffix2 = '';
        while($cols = mysqli_fetch_row($tblDetails )){
            $suffix2 .= "ALTER TABLE `". $table ."` \n ADD PRIMARY KEY (`".$cols[0]."`);\n\n";
        }


        $tblDetails = mysqli_query($connect,"SHOW FULL COLUMNS FROM $table WHERE (Extra LIKE 'auto_increment%')");
        $suffix3 = '';
        while($cols = mysqli_fetch_row($tblDetails )){
            $suffix3 = "ALTER TABLE `". $table ."` \n ADD PRIMARY KEY (`".$cols[0]."`);\n\n";
            $suffix3 = "ALTER TABLE `".$table."` \n MODIFY `".$cols[0]."` ".$cols[1]." NOT NULL AUTO_INCREMENT, ".$suffix4.";";
        }






        $return .= $kgbReturn;

        $result = mysqli_query($connect, 'SELECT * FROM '.$table);
        $num_fields = mysqli_num_fields($result);

        // insert into all values 
        for ($i = 0; $i < $num_fields; $i++){

            while($row = mysqli_fetch_row($result)){

                $return .= 'INSERT INTO '.$table.' VALUES(';

                for($j=0; $j < $num_fields; $j++){
                    $row[$j] = addslashes($row[$j]);
                    $row[$j] = str_replace (array("\r\n", "\n", "\r", PHP_EOL), '\r', $row[$j])
    ;

                    if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return .= '""'; }
                    if ($j < ($num_fields-1)) { $return .= ','; };
                }
                $return .= ");\n";
            }
        }
        $return .= "\n\n"; // insert values completed. 


        // now add primary key and auto increment statements if exist 
        $return .= $suffix2 . $suffix3 . "\n\n\n";  


        echo "<pre>".$return ."</pre>"; // debug line. comment if you don't like.


    }


    // we need to write to a file that coded as utf-8
    $bkTime = date('Y_m_j_H_i_s');
    $fileName = 'backup-db-'.$bkTime.'.sql';
    $f=fopen($fileName,"w"); 
    # Now UTF-8 - Add byte order mark 
    fwrite($f, pack("CCC",0xef,0xbb,0xbf));

    fwrite($f,$return); 
    fclose($f); 


    }

2 commentaires

Veuillez ajouter quelques explications à votre réponse.


Ce script produit un fichier SQL comme phpmyadmin.