Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como criar uma tabela com base no conjunto de resultados JDBC


Podemos extrair a correspondência mais próxima estrutura do conjunto de resultados e construa uma tabela.
Mas isso não pode ser a réplica exata, em termos de nome de tabela, chaves, tipo de mecanismo, se um campo é anulável ou não, etc. .

O trecho de código a seguir ajuda você a prosseguir de maneira a obter um resultado apropriado.
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() );

Executando com a parte acima do código, imprimiu a seguinte string:
Create table visitors ( ip VARCHAR( 6 ), bro VARCHAR( 6 ) )

Espero que isso ajude você a prosseguir.

Um exemplo semelhante pode ser encontrado em: Crie uma tabela usando ResultSet ???

ATUALIZAÇÃO 1 :

Você não pode fazer nada quando depende apenas de um conjunto de resultados no aplicativo do lado do cliente.
Deve ser sempre a consulta de seleção principal que seleciona dados apropriados de um tipo de dados composto como geometry , address , etc.
Exemplo :select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )

Para dar um exemplo de geometry tipo de dados :
O MySQL tem definições para seu Suporte espacial . Mas não tenho certeza até que ponto eles são bons em comparação com SQL Implementação do servidor de dados espaciais .

geometry é um tipo de dados composto e, portanto, não pode ser recuperado por consulta direta.
Você precisa de funções dependentes que analisem dados dessas colunas de dados e retornem em legível , identificável formatos de dados.
Exemplo :create table geom ( g geometry );
Convertendo ResultSet de select g from geom usar JAVA para criar uma instrução de tabela resultaria em um unknwon tipo de dados para a coluna g .
Create table geom ( g UNKNOWN )

Usando x(g) , y(g) funções de coordenação na coluna g retornará tipos de dados apropriados e aceitáveis.
Consulta select x(g), y(g) from geom será convertido para
Create table  ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) ) 

ATUALIZAÇÃO 2 :
Um conjunto de resultados pode ser gerado em combinação de várias tabelas usando relações. Há também uma chance de que os campos do conjunto de resultados sejam compostos de expressões e seus aliases. Portanto, os tipos de dados dos campos de coluna ou aliases resultantes são decididos como dinâmicos. Os metadados não estão cientes dos nomes exatos de tabelas, nomes de colunas e seus tipos de dados originais/pais da consulta.

Portanto, não é possível obter
  1. o nome único de uma tabela e use-o.
  2. o tipo de dados da coluna pai e use-o.

Observação :Isso também é aplicável a todos os outros tipos de dados específicos de banco de dados cruzado, como NVARCHAR , etc. Mas, consulte esta postagem para uma alternativa ao uso de NVARCHAR no MySQL .

Antes de tentar essa migração dinâmica de dados, deve ser responsabilidade dos aplicativos cliente conhecer os tipos de dados equivalentes e usá-los adequadamente.

Além disso, consulte Tipos de dados e intervalos para o Microsoft Access , MySQL e SQL Server Para maiores informações.