Сортировка таблиц БД от наименее зависимых к наиболее зависимым - PullRequest
1 голос
/ 28 мая 2010

Я выполняю миграцию данных, и база данных, которую я использую, позволяет экспортировать и импортировать каждую таблицу отдельно. В такой конфигурации импорт становится проблемой, так как важен порядок, в котором импортируются таблицы (вы должны импортировать ссылочные таблицы, прежде чем ссылаться на них).

Существует ли какой-либо внешний инструмент, позволяющий мне перечислять таблицы базы данных, отсортированные от наименее зависимых к наиболее зависимым?

Заранее спасибо.

1 Ответ

2 голосов
/ 31 мая 2010

Этот код помог мне решить эту проблему. Он сортирует таблицы от наименее зависимых к наиболее зависимым в соответствии с их отношениями FK, считанными из метаданных БД.

public class Main {
    public static void main(String[] args) throws SQLException {
        DriverManager.registerDriver(new TimesTenDriver());
        Connection c = ...;
        DatabaseMetaData md = c.getMetaData();

        final ResultSet rawTables = md.getTables(null, "<your schema>", "%", null);

        List<Table> tables = new ArrayList<Table>();

        while (rawTables.next()) {
            final String tableName = rawTables.getString("TABLE_NAME");
            Table table = new Table(tableName);

            ResultSet rawKeys = md.getImportedKeys(null, "<your schema>", tableName);

            while (rawKeys.next()) {
                table.refs.add(rawKeys.getString("PKTABLE_NAME"));
            }

            rawKeys.close();

            tables.add(table);
        }

        rawTables.close();
        c.close();

        LinkedList<List<Table>> layers = new LinkedList<List<Table>>();

        while (tables.size() > 0) {
            List<Table> indep = new ArrayList<Table>();
            for (Table o : tables) {
                indep.add(o);
                for (Table i : tables) {
                    if (i.refs.contains(o.name)) {
                        indep.remove(o);
                        break;
                    }
                }
            }

            layers.add(indep);

            for (Iterator<Table> it = tables.iterator(); it.hasNext(); ) {
                Table t = it.next();
                if (indep.contains(t)) {
                    it.remove();
                }
            }
        }

        for (ListIterator<List<Table>> it = layers.listIterator(layers.size()); it.hasPrevious(); ) {
            final List<Table> layer = it.previous();

            for (Table table : layer) {
                System.out.println("ttbulkcp -i <your DSN> <your schema>." + table + " " + table);
            }
        }
    }

    private static class Table {
        public final String name;
        public final Set<String> refs;

        public Table(String name) {
            this.name = name;
            this.refs = new HashSet<String>();
        }
    }
}
...