Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer une table basée sur l'ensemble de résultats JDBC

Nous pouvons extraire la correspondance la plus proche structure à partir du jeu de résultats et construisez une table.
Mais ce ne peut pas être la réplique exacte, en termes de nom de table, de clés, de type de moteur, si un champ est nullable ou non, etc. .

L'extrait de code suivant vous aide à procéder de manière à obtenir un résultat approprié.

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

Exécution avec la partie ci-dessus du code, impression de la chaîne suivante :

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

J'espère que cela vous aidera à aller plus loin.

Un exemple similaire peut être trouvé à : Créer une table en utilisant ResultSet ???

MISE À JOUR 1 :

Vous ne pouvez rien faire lorsque vous ne dépendez que d'un ensemble de résultats côté client.
Il doit toujours s'agir de la requête de sélection principale qui sélectionne les données appropriées à partir d'un type de données composite comme geometry , address , etc.
Exemple :select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )

Pour donner un exemple de geometry type de données :
MySQL a des définitions pour son Soutien spatial . Mais je ne sais pas dans quelle mesure ils sont bons par rapport à SQL Implémentation du serveur de données spatiales .

geometry est un type de données composite et ne peut donc pas être récupéré par requête directe.
Vous avez besoin d'une ou plusieurs fonctions dépendantes qui analysent les données de ces colonnes de données et renvoient en lisible , identifiable formats de données.
Exemple :create table geom ( g geometry );
Convertir ResultSet à partir de select g from geom l'utilisation de JAVA dans une instruction de création de table entraînerait un unknwon type de données pour la colonne g .

Create table geom ( g UNKNOWN )

Utilisation de x(g) , y(g) fonctions de coordonnées sur la colonne g renverra les types de données appropriés et acceptables.
Requête select x(g), y(g) from geom sera converti en

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

MISE À JOUR 2 :
Un jeu de résultats peut être généré en combinant plusieurs tables à l'aide de relations. Il est également possible que les champs de l'ensemble de résultats soient composés d'expressions et de leurs alias. Par conséquent, les types de données des champs de colonne ou des alias résultants sont décidés dynamiques. Les métadonnées ne connaissent pas les noms exacts des tables, les noms des colonnes et leurs types de données d'origine/parents de la requête.

Donc, il n'est pas possible d'obtenir

  1. le nom unique d'une table et l'utiliser.
  2. le type de données de la colonne parent et l'utiliser.

Remarque  :Cela s'applique également à tous les autres types de données spécifiques à une base de données croisée, comme NVARCHAR , etc..Mais, veuillez vous référer à cette publication pour une alternative à l'utilisation de NVARCHAR dans MySQL .

Avant d'essayer une telle migration dynamique de données, il devrait incomber aux applications clientes de connaître les types de données équivalents et de les utiliser en conséquence.

Reportez-vous également à Types et plages de données pour Microsoft Access , MySQL et SQL Server pour plus d'informations.