HomeBlogMagic

Datenbank mit Constraints löschen

Beim programmieren meiner Homepage ist mir ein kleines Problem aufgefallen.
Als Tabllen Typ für meine Datenbanken benutze ich immer InnoDB. Der Vorteil von Geschwindigkeit und das benutzen von Constraints sind für mich wichtiger als optimierter Speicherplatz wie bei MyISAM

Für meine Tests benutze ich sowohl die online Datenbank als auch meine lokale Datenbank. Die lokale hat für mich priorität, da ich mit dieser am meisten arbeite.

Wenn ich das Tabellen design übertragen möchte versuche ich das immer per Hand. Sollte sich aber hin und wieder mal einiges geändert haben, macht es Sinn die Datenbank komplett zu überspielen.

Vorher muss allerdings die alte Datenbank gelöscht werden, bzw. die Tabellen. Am einfachsten wäre es die Datenbank per DROP DATABASE zu löschen und eine neue an zu legen. Mein Hoster verbietet dies leider, weshalb ich alle Tabellen löschen muss. Genau da tritt das Problem auf.

Wenn man stark mit CONSTRAINTS verknüpfte Tabellen, immerhin sind das bei mir 48 Tabellen mit 51MB Speicherbedarft, löschen möchte, tritt ein Fehler auf, da Constraints leider nicht vorher deaktiviert werden und so einige Tabellen das löschen unterbinden.

Beim wiederholen des Lösch Befehls verschwinden mit der Zeit immer mehr Tabellen, bis keine mehr da ist. Da mir das sehr radikal erscheint und ich für bestimmte Tabellen keine Ausnahme machen kann kommt das für mich nicht infrage, weswegen mir nur das löschen von Tabellen überig bleibt. Um das alles zu automatisieren hab ich ein kleines Skript geschrieben das alle CONSTRAINTS löscht und dann alle Tabellen dropt. Ich weiß dass das noch optimiert werden kann, da allerdings nur selten für das Skript bedarf besteht, is das für mich weniger sinnvoll. Man kann problemlos noch eine Funktion einfügen das Tabellen auslässt um z.B. nicht versehentlich Nutzer oder Protokolle zu löschen

Der Code:

mysql_connect($mysqlhost,$mysqluser,$mysqlpass) or die ("Verbindung zur Datenbank fehlgeschlagen");
mysql_select_db($mysqlname) or die (mysql_error());
mysql_query('set character set utf8;');
$qry = mysql_query("SHOW tables");
while($get=mysql_fetch_array($qry))
{
  $table = mysql_fetch_array(mysql_query("SHOW CREATE TABLE `".$get[0]."`"));
  $tabar = explode("\n", $table[1]);
  for($i=0; isset($tabar[$i]); $i++)
  {
    if(strstr($tabar[$i], "CONSTRAINT"))
    {
      $constraint = str_replace('`', '', trim(str_search($tabar[$i], "CONSTRAINT", "FOREIGN")));
      mysql_query("ALTER TABLE `".$table[0]."` DROP FOREIGN KEY `".$constraint."`");
    }
  }
}
$qry = mysql_query("SHOW tables");
while($get=mysql_fetch_array($qry))
{
  mysql_query("DROP TABLE `".$get[0]."`");
}
echo "done";

function str_search($var, $startstring, $endstring)
{
  $resultat = FALSE;
  if ($resa = strstr($var,$startstring)) 
  {
    $resb = str_replace($startstring, "", $resa);
    $endstueck = strstr($resb, $endstring);
    $resultat = str_replace($endstueck,"",$resb);
  }
  return $resultat;
}
Permalink: https://adirmeier.de/Blog/ID_56
Tags: Blog, CONSTRAINTS, InnoDB, MYSQL, PHPvon am 2012-03-06