sql >> データベース >  >> RDS >> Mysql

JDBC結果セットに基づいてテーブルを作成する方法

    最も近い一致を抽出できます 結果セットから構造化してテーブルを作成します。
    ただし、 テーブル名、キー、エンジンタイプ、フィールドがnull許容かどうかなどの点で、これを正確に複製することはできません。

    次のコードスニペットは、適切な結果を得る方法で進めるのに役立ちます。

    String sql = "select * from visitors";
    ResultSet rs = stmt.executeQuery( sql );
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    String tableName = null;
    StringBuilder sb = new StringBuilder( 1024 );
    if ( columnCount > 0 ) { 
        sb.append( "Create table " ).append( rsmd.getTableName( 1 ) ).append( " ( " );
    }
    for ( int i = 1; i <= columnCount; i ++ ) {
        if ( i > 1 ) sb.append( ", " );
        String columnName = rsmd.getColumnLabel( i );
        String columnType = rsmd.getColumnTypeName( i );
    
        sb.append( columnName ).append( " " ).append( columnType );
    
        int precision = rsmd.getPrecision( i );
        if ( precision != 0 ) {
            sb.append( "( " ).append( precision ).append( " )" );
        }
    } // for columns
    sb.append( " ) " );
    
    System.out.println( sb.toString() );
    

    コードの上記の部分で実行し、次の文字列を出力します:

    Create table visitors ( ip VARCHAR( 6 ), bro VARCHAR( 6 ) )
    

    これがあなたがさらに進むのに役立つことを願っています。

    同様の例は、次の場所にあります。 ResultSetを使用してテーブルを作成します???

    アップデート1

    クライアント側のアプリケーションで結果セットのみに依存している場合は、何もできません。
    常にメインの選択クエリである必要があります。 geometryなどの複合データ型から適切なデータを選択します 、address 、など。
    select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )

    geometryの例を示すには データ型
    MySQLには、の定義があります。 空間サポート 。しかし、 SQLと比較してどれだけ優れているかはわかりません。サーバーによる空間データの実装

    geometry は複合データ型であるため、直接クエリでは取得できません。
    このようなデータ列のデータを解析し、読み取り可能で返す依存関数が必要です。 、識別可能 データ形式。
    create table geom ( g geometry );
    ResultSet from select g from geomを変換する JAVAを使用してテーブルステートメントを作成すると、unknwonになります。 列gのデータ型 。

    Create table geom ( g UNKNOWN )
    

    x(g)を使用する 、y(g)gの座標関数 適切で許容可能なデータ型を返します。
    クエリselect x(g), y(g) from geom

    に変換されます
    Create table  ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) ) 
    

    アップデート2
    結果セットは、リレーションを使用して複数のテーブルの組み合わせで生成される場合があります。結果セットフィールドが式とそのエイリアスで構成されている可能性もあります。したがって、結果の列フィールドまたはエイリアスのデータ型は動的に決定されます。メタデータは、テーブルの正確な名前、列名、およびクエリからの元の/親のデータ型を認識しません。

    したがって、取得することはできません

    1. テーブルの単一の名前とそれを使用します。
    2. 親列のデータ型とそれを使用します。

    :これは、 NVARCHAR など、他のすべてのクロスデータベース固有のデータ型にも適用できます。 など。ただし、MySQLでのNVARCHARの使用に代わる方法については、この投稿を参照してください

    このような動的なデータ移行を試みる前に、同等のデータ型を知り、それに応じてそれらを使用するのはクライアントアプリケーションの責任である必要があります。

    また、 MicrosoftAccessのデータ型と範囲も参照してください。 、MySQLおよびSQL Server 詳細については。



    1. PostgreSQLはWHERE句で列エイリアスを受け入れません

    2. OracleSQLピボットクエリ

    3. Oracle:ROWNUMをORDERBY句と組み合わせて使用​​してテーブル列を更新する

    4. ON句とSQLのusing句の違い