2010-07-19 5 views
9

Bin ziemlich neu in der Verwendung von MySQL und ein absoluter Neuling bei Perl, aber ich versuche, jemandes Skript zu hacken, um mir zu helfen. Ich habe das Skript von here. Es sieht bis jetzt gut aus, aber es scheitert, da die Tabellen eine Fremdschlüsselprüfung haben. Ich konnte durch phpMyAdmin gehen und versuchen, sie alle nacheinander zu löschen, aber das dauert ewig und ist mein drittes Mal dies zu tun zu haben :(Meine Frage ist, kann dieser Skript Fügte werden enthalten:Fremdschlüssel deaktivieren Löschen von InnoDB -Tabellen Perl Script

`SET FOREIGN_KEY_CHECKS = 0; 

bevor es in dem drop table-Befehl ausgeführt wird? ich habe versucht, das Skript durch zu folgen, aber einen endgültigen Befehl Teil des Skripts nicht (wahrscheinlich aufgrund von Unwissenheit/mangelndem Verständnis). Jede Hilfe sehr geschätzt.

#!/usr/bin/perl 

use strict; 
use DBI; 

my $hostname = ''; 
my $database = ''; 
my $username = ''; 
my $password = ''; 

my $dbh = DBI->connect("dbi:mysql:${database}:$hostname", 
    $username, $password) or die "Error: $DBI::errstr\n"; 

my $sth = $dbh->prepare("SHOW TABLES"); 
$sth->execute or die "SQL Error: $DBI::errstr\n"; 
my $i = 0; 
my @all_tables =(); 
while(my $table = $sth->fetchrow_array) 
{ 
    $i++; 
    print "table $i: $table\n"; 
    push @all_tables, $table; 
} 
my $total_table_count = $i; 

print "Enter string or regex to match tables to " 
    . "delete (won't delete yet): "; 
my $regex = <STDIN>; 
chomp $regex; 

$i = 0; 
my @matching_tables =(); 
foreach my $table (@all_tables) 
{ 
    if($table =~ /$regex/i) 
    { 
    $i++; 
    print "matching table $i: $table\n"; 
    push @matching_tables, $table; 
    } 
} 
my $matching_table_count = $i; 

if($matching_table_count) 
{ 
    print "$matching_table_count out of $total_table_count " 
    . "tables match, and will be deleted.\n"; 
    print "Delete tables now? [y/n] "; 
    my $decision = <STDIN>; 
    chomp $decision; 

    $i = 0; 
    if($decision =~ /y/i) 
    { 
    foreach my $table (@matching_tables) 
    { 
     $i++; 
     print "deleting table $i: $table\n"; 
     my $sth = $dbh->prepare("DROP TABLE $table"); 
     $sth->execute or die "SQL Error: $DBI::errstr\n"; 
    } 
    } 
    else 
    { 
    print "Not deleting any tables.\n"; 
    } 
} 
else 
{ 
    print "No matching tables.\n"; 
} 
+0

Möchten Sie den Fremdschlüssel unbestimmt entfernen oder lassen Sie ihn vorübergehend nicht überprüfen, während Sie mit der Datenbank arbeiten? – Wrikken

+0

(auf einer Randnotiz könnte der Perl-Code sein: 'my $ sth = $ dbh-> prepare (" SET FOREIGN_KEY_CHECKS = 0; "); $ sth-> execute') – Wrikken

+0

Sie können' -> do' in verwenden Stelle eines Prepare/Execute-Paares, wenn du nie wieder den vorbereiteten Handle benutzen wirst :) – hobbs

Antwort

11

Einstellung finden kann, die FOREIGN_KEY_CHECKS value zu Null:

SET FOREIGN_KEY_CHECKS = 0; 

... vor den Drop-Skripten werden die Fremdschlüsseleinschränkungen in der Instanz weit deaktiviert. Da auf einer MySQL-Instanz mehr als ein Katalog/eine Datenbank vorhanden sein kann, wirkt sich dies auf andere Datenbanken aus.

Die allgemeine Angewohnheit besteht darin, diese in der Reihenfolge der Schlüsselabhängigkeit zu schreiben, indem Daten aus übergeordneten Tabellen vor Kindern gelöscht/abgeschnitten werden.

+0

wie man es nach der Ausführung einer Reihe von SQL auf den alten Wert zurücksetzt? 'SET FOREIGN_KEY_CHECKS =?;' Danke! –

+0

'SET foreign_key_checks = 1;' Ich glaube auch, dass diese Variable sitzungsbasiert ist, also wird auch das Beenden von mysql den Trick machen. Ich würde trotzdem das oben genannte ausführen, um sicher zu sein. – matt

+0

Eine sehr wichtige Anmerkung ist, dass "das Setzen von foreign_key_checks auf 1 keine Überprüfung der vorhandenen Tabellendaten auslöst. Daher werden Zeilen, die zur Tabelle hinzugefügt werden, während foreign_key_checks = 0 nicht auf Konsistenz überprüft werden." (über [mysql-Dokumentation] (http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html#sysvar_foreign_key_checks)) – matt

Verwandte Themen