2017-11-10 7 views
2

을 기존 테이블을 찾을 수 없습니다. 그럼 난 아직 존재하고 몇 가지 기본 데이터로이 테이블을 채우고하지 않는 경우 테이블을 생성 init() 메서드를 호출 : 처음 EmbeddedDerbyDataConnection의 객체를 생성 한 후DatabaseMetaData의 번호에의 getTables 내가 자바 더비 데이터베이스에 연결하고있어 더비

private void init() throws SQLException { 
    DatabaseMetaData metaData = this.connection.getMetaData(); 
    ResultSet rs = metaData.getTables(null, null, "mytable", null); 
    if (rs.next()) { 
     System.out.println("Table already exists."); 
    } else { 
     Statement stmt = this.connection.createStatement(); 
     String query = "CREATE TABLE mytable (...)"; 
     stmt.executeUpdate(query); 
     stmt.close(); 

     stmt = this.connection.createStatement(); 
     query = "INSERT INTO mytable VALUES (...)"; 
     stmt.executeUpdate(query); 
     stmt.close(); 
    } 
} 

를, 그것은 확인을 보였다. 나는 SELECT * FROM mytable에 의해 그것을 테스트하고 나는이 테이블에 넣어 기본 데이터를 반환했습니다.

두 번째 호출 후 Exception in thread "main" java.sql.SQLException: Table/View 'mytable' already exists in Schema 'APP'.init() 메서드의 ResultSet rs가 비어있는 것 같습니다. 그러나 SELECT * FROM mytable을 호출 한 후 데이터가 있으며 올바른 것입니다.

어떻게 해결할 수 있습니까? 문제는 어디에있을 수 있습니까?

답변

2

Derby의 .getTables 구현은 대소 문자를 구분하는 것처럼 보이며 Derby는 테이블 이름을 대문자로 강제 변환합니다.

java.sql.SQLException : 테이블/뷰 'MYTABLE'이 이미 스키마 'APP'에 존재합니다.

그래서, 당신은 아마 경기를 얻기 위해

ResultSet rs = metaData.getTables(null, null, "mytable".toUpperCase(), null); 

같은 것을 사용해야합니다.

+1

대/소문자 구분은 JDBC 사양에서 필요합니다 (예 : 패턴 매개 변수 _가 "데이터베이스에 저장된 테이블 이름과 일치해야 함"). 따라서 데이터베이스에서 따옴표로 묶지 않은 개체 이름을 대문자로 저장하면 패턴이 대문자로도 일치해야합니다. –