2012-04-13 53 views
0

在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; 
     } 
    } 

} 
+0

在MySQL和應用程序中直接嘗試查詢時,是否使用相同的用戶? – 2012-04-13 15:39:32

回答

1

臨時表自動刪除。

詳見MySQL CREATE TABLE文檔:

創建表時,您可以使用TEMPORARY關鍵詞。 TEMPORARY表僅對當前連接可見,並在關閉連接時自動刪除。這意味着兩個不同的連接可以使用相同的臨時表名稱而不會相互衝突,也不會使用同名的現有非TEMPORARY表衝突。 (現有的表被隱藏,直到臨時表被刪除)。

如果你想創建一個臨時表做了一些工作,當你開始你的工作,並執行您的更新,你應該創建/ SELECT反對它的聲明。它會在您關閉連接時自動刪除,並且不會與使用相同臨時表名稱的其他連接發生衝突。

+0

但我沒有關閉連接。 – 2012-04-13 15:27:28

+0

你在哪裏執行你的'SELECT * FROM Book'?我沒有看到你的主要方法。如果你從'getInstancia()'返回相同的連接,那麼它應該仍然可見。但是如果你從mysql命令行或其他程序訪問數據庫,它不會。 – Jonathan 2012-04-13 15:30:20

1

臨時表是每個數據庫連接。因此,如果您嘗試從另一個連接訪問臨時表,則不會看到它。

+0

因此,如果我從Java執行'從Book *中選擇*它應該工作正常,對吧? – 2012-04-13 15:28:35

+0

取決於您如何處理數據庫連接。你在每個查詢之前打開一個新的嗎?你有一個連接池嗎?'Conexion.getInstancia()'得到一個隨機的一個?這些場景中的每一個都可能導致在創建臨時表時以及嘗試訪問臨時表時使用不同的連接。 – 2012-04-13 15:32:07

+0

我只是關閉聲明,但不是連接。我會把我的'Conexion'類。 – 2012-04-13 15:35:08