sql >> Base de Datos >  >> RDS >> Mysql

Cómo crear una tabla basada en el conjunto de resultados de JDBC

Podemos extraer la coincidencia más cercana estructura del conjunto de resultados y construya una tabla.
Pero esta no puede ser la réplica exacta, en términos de nombre de tabla, claves, tipo de motor, si un campo es anulable o no, etc. .

El siguiente fragmento de código lo ayuda a proceder de manera de obtener un resultado apropiado.

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() );

Ejecutando con la parte anterior del código, se imprime la siguiente cadena:

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

Déjame esperar que esto te ayude a continuar.

Se puede encontrar un ejemplo similar en: Crear una tabla usando ResultSet ???

ACTUALIZACIÓN 1 :

No puede hacer nada cuando depende únicamente de un conjunto de resultados en la aplicación del lado del cliente.
Siempre debe ser la consulta de selección principal que selecciona los datos adecuados de un tipo de datos compuestos como geometry , address , etc.
Ejemplo :select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )

Para dar un ejemplo de geometry tipo de datos :
MySQL tiene definiciones para su Apoyo espacial . Pero no estoy seguro de hasta qué punto son buenos en comparación con SQL Implementación del servidor de datos espaciales .

geometry es un tipo de datos compuesto y, por lo tanto, no se puede recuperar mediante una consulta directa.
Necesita funciones dependientes que analicen los datos de dichas columnas de datos y los devuelvan en legible , identificable formatos de datos.
Ejemplo :create table geom ( g geometry );
Conversión de ResultSet de select g from geom el uso de JAVA para crear una declaración de tabla daría como resultado un unknwon tipo de datos para la columna g .

Create table geom ( g UNKNOWN )

Usando x(g) , y(g) coordinar funciones en la columna g devolverá tipos de datos adecuados y aceptables.
Consulta select x(g), y(g) from geom se convertirá a

Create table  ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) ) 

ACTUALIZACIÓN 2 :
Se puede generar un conjunto de resultados en combinación de varias tablas usando relaciones. También existe la posibilidad de que los campos del conjunto de resultados estén compuestos por expresiones y sus alias. Por lo tanto, los tipos de datos de los campos de columna o alias resultantes se deciden como dinámicos. Los metadatos no conocen los nombres exactos de las tablas, los nombres de las columnas y sus tipos de datos originales/principales de la consulta.

Entonces, no es posible obtener

  1. el nombre único de una tabla y utilícelo.
  2. el tipo de datos de la columna principal y utilícelo.

Nota :Esto también se aplica a todos los demás tipos de datos específicos de bases de datos cruzadas, como NVARCHAR , etc. Pero consulte esta publicación para ver una alternativa al uso de NVARCHAR en MySQL .

Antes de intentar una migración de datos tan dinámica, debe ser responsabilidad de las aplicaciones cliente conocer los tipos de datos equivalentes y utilizarlos en consecuencia.

Además, consulte Tipos de datos y rangos para Microsoft Access , MySQL y SQL Server para más información.