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";
}
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
(auf einer Randnotiz könnte der Perl-Code sein: 'my $ sth = $ dbh-> prepare (" SET FOREIGN_KEY_CHECKS = 0; "); $ sth-> execute') – Wrikken
Sie können' -> do' in verwenden Stelle eines Prepare/Execute-Paares, wenn du nie wieder den vorbereiteten Handle benutzen wirst :) – hobbs