Это больше похоже на концептуальный вопрос.
У меня запланированное задание со многими входными таблицами (SQLite) table1 ... tableN
и мне нужно выполнить серию удаления / вставки в MySQL, обрабатывая таблицу за таблицей.
READ SQLITE TABLE -> EMPTY MYSQL TABLE -> FILL MYSQL TABLE
Конечно, если (MySQL) table1
имеет внешний ключ, указывающий на table2
, table2
должны быть удалены и заполнены до table1
, Я вручную сортирую входящие таблицы, но это не очень хорошая идея с таблицей 30+ и может привести к ошибкам.
SET FOREIGN_KEY_CHECKS = 0
является не вариант.
Таким образом, проблема будет заключаться в сортировке всей таблицы MySQL по количеству входящих FK (от высокой к низкой), например:
// Doctrine DBAL example but it's easily understandable
$schema = $this->connection->getSchemaManager();
// Init chart where keys are table names, values are # of incoming FKs
$chart = array_fill_keys($schema->listTableNames(), 0);
// Build the chart
foreach ($schema->listTables() as $table) {
foreach ($table->getForeignKeys() as $foreignKey) {
$chart[$foreignKey->getForeignTableName()]++;
}
}
// Sort high to low by values
arsort($chart);
Есть ли недостатки в моих рассуждениях? Мой вопрос как бороться с само-чужими ключами (просто игнорировать это?) и как иметь дело с циркулярными ссылками (Т.е. table1 -> table2 -> table3 -> table1
).
Задача ещё не решена.
Других решений пока нет …