@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как найти таблицу в нужной схеме MySQL?

В ходе изучения SQL возник вопрос - что если я запущу программу, а нужной таблицы не будет? В итоге дошёл до такой функции:

static void initTable(String tableName) {
	try (Connection c = getConnection()) {

		PreparedStatement preparedStatement = c.prepareStatement("SELECT count(*) FROM information_schema.tables WHERE table_name = ?LIMIT 1;");
		preparedStatement.setString(1, tableName);
		
		ResultSet resultSet = preparedStatement.executeQuery();
		resultSet.next();
		if (resultSet.getInt(1) == 0) {
			c.createStatement().execute("CREATE TABLE tutorial." + tableName + " (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, specialty VARCHAR(50) NOT NULL, salary INT NOT NULL, PRIMARY KEY (id));");
			System.out.println("Table \"" + tableName + "\" created.");
		} else
			System.out.println("Table \"" + tableName + "\" exists.");

		System.out.println("\n------------------------------\n");
	} catch (SQLException e) {
		e.printStackTrace();
	}
}


Вроде всё работает, но сразу наткнулся на проблему. В моём workbench висит несколько схем и когда я запускаю проверку, она ищет по всем схемам. Если таблицы с нужным названием нет, то создаёт там, где я указал. Но что если в другой схеме уже есть таблица с таким названием... как уточнить поиск до границ нужной схемы?
  • Вопрос задан
  • 166 просмотров
Решения вопроса 3
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Думаю, что данный вопрос отпадет, когда вы познакомитесь с технологией ORM и с таким фреймворком, как например, Hibernate. Если вкратце, то там есть опция, которая при запуске проверяет наличие таблиц и в случае отсутствия оных, создает таблицы автоматически. Но как правило, на production таблицы автоматически не создают.
Обычно, пишут sql скрипты, которые впоследствии мигрируются при помощи таких фреймворков, как например, flyway.
Таким образом, с учетом того, что вы работаете по принципу database first (т.е. вы создаете БД, схему и таблицу), то ситуации, когда не будет нужная таблица не должно быть. А даже если такая ситуация будет, то пускай выбрасывается исключение и приложение падает. Можете также ознакомиться с такими терминами. как database first, code first, model first.
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
что если я запущу программу, а нужной таблицы не будет?

Получите соответствующее сообщение об ошибке.

дошёл до такой функции

Сотрите срочно. Существование таблицы (вообще или в определённой схеме) проверяется запросом в INFORMATION_SCHEMA.TABLES.

SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
-- WHERE TABLE_NAME = 'my_table_name'
;


что если в другой схеме уже есть таблица с таким названием...

Ну допустим есть, и что?
Ответ написан
Комментировать
martin74ua
@martin74ua Куратор тега MySQL
Linux administrator
Посмотрите как ставятся движки сайтов.
Операции начальной инициализации бд всегда вынесены отдельно - в инсталлятор, просто в виде дампа...

Т.е. сначала создаем базу, выполняем начальное заполнение, а дальше - работаем с имеющейся базой.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы