Создать временную таблицу в MySQL из Java

У меня есть это:

public static void createTemporaryTable() {
        Statement s = null;
        sentence = "CREATE TEMPORARY TABLE Book (ISBN int NOT NULL, " +
                "title varchar(45), author varchar(45), price double, PRIMARY KEY  (`ISBN`));";

        try {
            s = Conexion.getInstancia().createStatement();
            s.executeUpdate(sentence);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                s.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

Затем:

public class System {

    public static void main(String[] args) {
        SqlSentencesList.createTemporaryTable();
    }

}

Но когда я выполняю select * from Book, MySQL сообщает мне, что таблица Book не существует. Я не получаю никаких сообщений об ошибках от java, поэтому таблица должна быть создана, но это не так.

Если я выполняю одно и то же предложение sql для создания временной таблицы непосредственно в mysql, все работает нормально.

Это мой Conexion класс:

public class Conexion {

    private static Connection conexion = null;



    private Conexion() {

    }

    public static Connection getInstancia() {
        if (conexion == null) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conexion = DriverManager.getConnection(
                        "jdbc:mysql://localhost/Esquema_VentaLibros","gustavo", "123581321");

            } catch (SQLException sqlex) {
                sqlex.printStackTrace();
            } catch(ClassNotFoundException cnfex) {
                cnfex.printStackTrace();
            }
            return conexion;
        }
        else {
            return conexion;
        }
    }

}

person Aikanáro    schedule 13.04.2012    source источник
comment
Используете ли вы одного и того же пользователя при выполнении запроса непосредственно в MySQL и в вашем приложении?   -  person Dmytro Shevchenko    schedule 13.04.2012


Ответы (2)


Временные таблицы автоматически удаляются при закрытии соединения.

Подробнее см. в документации MySQL CREATE TABLE:

Вы можете использовать ключевое слово TEMPORARY при создании таблицы. ВРЕМЕННАЯ таблица видна только текущему соединению и автоматически удаляется при закрытии соединения. Это означает, что два разных соединения могут использовать одно и то же имя временной таблицы, не конфликтуя друг с другом или с существующей не-TEMPORARY таблицей с таким же именем. (Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.)

Если вы хотите создать временную таблицу для выполнения какой-либо работы, вы должны создать ее, когда начнете свою работу, и выполнять против нее операторы UPDATE/SELECT. Он будет автоматически удален, когда вы закроете соединение, и не будет конфликтовать с другими соединениями, использующими то же имя временной таблицы.

person Jonathan    schedule 13.04.2012
comment
Но я не закрываю связь. - person Aikanáro; 13.04.2012
comment
Где вы выполняете свой SELECT * FROM Book? Я не вижу этого в вашем основном методе. Если вы получаете такое же соединение от getInstancia(), оно все еще должно быть видно. Но если вы получите доступ к БД из командной строки mysql или другой программы, этого не произойдет. - person Jonathan; 13.04.2012

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

person Dmytro Shevchenko    schedule 13.04.2012
comment
Итак, если я выполню select * from Book из Java, все должно работать нормально, верно? - person Aikanáro; 13.04.2012
comment
Зависит от того, как вы обрабатываете соединения с базой данных. Вы открываете новый перед каждым запросом? У вас есть пул соединений, и Conexion.getInstancia() получает случайное одно из них? Каждый из этих сценариев может привести к использованию разных соединений при создании временной таблицы и при попытке доступа к ней. - person Dmytro Shevchenko; 13.04.2012
comment
Я просто закрываю заявление, но не соединение. Я поставлю свой Conexion класс. - person Aikanáro; 13.04.2012
comment
Сначала выполните быстрый тест — выполните еще один оператор в методе createTemporaryTable(). Попробуйте select * from Books сразу после создания временной таблицы. - person Dmytro Shevchenko; 13.04.2012