Sono abbastanza nuovo nell'usare MySQL e un novizio totale in Perl, ma sto provando a hackerare script di qualcun altro per aiutarmi. Ho ottenuto la sceneggiatura da here. Sembra fantastico finora, ma fallisce perché le tabelle hanno qualche controllo di chiave straniera in corso. Potrei passare attraverso phpMyAdmin e cercare di eliminarli tutti uno per uno, ma questo prende per sempre ed è la mia terza volta di dover fare questo :(La mia domanda è, può essere questo script ammended per includere:disabilita il controllo della chiave esterna eliminando le tabelle InnoDB Script Perl
`SET FOREIGN_KEY_CHECKS = 0;
prima che si esegue il comando drop table? ho provato a seguire il copione attraverso ma non sono riuscito a trovare una parte di comando definitiva dello script (probabilmente a causa di ignoranza/mancanza di comprensione). Qualsiasi aiuto molto apprezzato.
#!/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";
}
Si desidera rimuovere la chiave esterna a tempo indeterminato, o semplicemente fare in modo che non controllino nulla mentre si lavora con il database? – Wrikken
(su una nota a margine, il codice perl potrebbe essere: 'my $ sth = $ dbh-> prepare (" SET FOREIGN_KEY_CHECKS = 0; "); $ sth-> execute') – Wrikken
Puoi usare' -> do' in luogo di una coppia preparata/eseguita se non si userà mai più la maniglia preparata :) – hobbs