Довольно в новинку для использования MySQL и общего новичка в Perl, но пытаюсь взломать кого-то elses сценарий для выручения меня. Я получил сценарий отсюда. Это выглядит большим до сих пор, но это перестало работать, поскольку таблицы имеют некоторое продолжение проверки внешнего ключа. Я мог пройти phpmyadmin и попытаться удалить их всех один за другим, но это берет навсегда и является моим третьим разом необходимости сделать это :( Мой запрос, может этот сценарий быть исправленным для включения:
`SET FOREIGN_KEY_CHECKS = 0;
прежде чем это выполнит команду таблицы отбрасывания? Я пытался довести до конца сценарий, но не мог найти категорическую часть команды сценария (вероятно, из-за незнания/отсутствия понимания). Любая справка значительно ценится.
#!/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 = ;
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 = ;
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";
}
Установка значения FOREIGN_KEY_CHECKS равным нулю:
SET FOREIGN_KEY_CHECKS = 0;
... перед сценариями отбрасывания отключит ограничения внешнего ключа для всего экземпляра. Поскольку в экземпляре MySQL может быть несколько каталогов / баз данных, это может повлиять на что-либо еще с точки зрения базы данных.
Общая привычка состоит в том, чтобы записывать их в порядке зависимости ключей, удаляя / усекая данные из родительских таблиц перед дочерними.