"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
10 Réponses :
Vous ne devriez pas vraiment m'inquiéter à ce sujet - la seule chose qu'une pièce d'identité devrait être unique; Sa valeur réelle devrait être non pertinente. P>
-1 omg, vous ne pouvez pas être sérieux à ce sujet, non? S'il vous plaît, n'hésitez pas les personnes avec des "solitionnels" de merde. Au lieu de les encourager à repenser et à réparer leur approche. S'il te plaît.
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. p>
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. P>
ne peut pas être fait à l'aide de la fonctionnalité AutoTyremCremmentation de MySQL. Vous pouvez rouler votre propre solution, par ex. Un mélange entre les déclencheurs de la logique d'application et de la base de données. Mais, Seriosly, votre conception est fortement cassée si cela vous oblige à recycler des identifiants uniques. P>
Ne pouviez pas simplement créer une autre table où vous sauveriez des références comme celle-ci (cela pourrait être fait en interrogeant le minimum) et laissez votre table principale pointer sur cette table auxiliaire? P>
Voici un blog que j'ai googlé qui traite de votre problème: Voir ici . P>
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. . P>
est-il vraiment nécessaire que le système s'ajuste à chaque suppression? P>
Accentuellement, l'incrément automatique est faite pour que cela augmente, quelle que soit la quantité de lignes là-bas. P>
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. P>
Alors, mon avantage serait - laissez-le seul :) p>
Disclaimer: strong> 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. Em> p>
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! p>
xxx pré> 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. P>
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. P> blockquote>
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.
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>;
update table_name set id =NULL; alter table table_name change column `id` `id` int auto_increment;
Vous ne pouvez pas définir la colonne de clé primaire sur NULL
ALTER TABLE event AUTO_INCREMENT = 1;
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);
}
Veuillez ajouter quelques explications à votre réponse.
Ce script produit un fichier SQL comme phpmyadmin.
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.