Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So erstellen Sie eine Tabelle basierend auf dem JDBC-Ergebnissatz

Wir können die nächste Übereinstimmung extrahieren Struktur aus der Ergebnismenge und erstellen Sie eine Tabelle.
Aber dies kann nicht die exakte Kopie sein, in Bezug auf Tabellenname, Schlüssel, Engine-Typ, ob ein Feld nullable ist oder nicht usw. .

Das folgende Code-Snippet hilft Ihnen, so vorzugehen, dass Sie ein angemessenes Ergebnis erhalten.

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

Ausführen mit dem obigen Teil des Codes, der folgende Zeichenfolge ausgibt:

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

Lassen Sie mich hoffen, dass dies Ihnen hilft, weiterzumachen.

Ein ähnliches Beispiel finden Sie unter: Erstellen Sie eine Tabelle mit ResultSet ???

AKTUALISIERUNG 1 :

Sie können nichts tun, wenn Sie nur von einer Ergebnismenge in der clientseitigen Anwendung abhängen.
Es sollte immer die Hauptauswahlabfrage sein die richtige Daten aus einem zusammengesetzten Datentyp wie geometry auswählt , address usw.
Beispiel :select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )

Um ein Beispiel für geometry zu geben Datentyp :
MySQL hat Definitionen für seinen Räumliche Unterstützung . Aber ich bin mir nicht sicher, wie gut sie im Vergleich zu SQL sind Serverimplementierung von Spatial Data .

geometry ist ein zusammengesetzter Datentyp und kann daher nicht durch direkte Abfrage abgerufen werden.
Sie benötigen abhängige Funktion(en), die Daten aus solchen Datenspalten parst und lesbar zurückgibt , identifizierbar Datenformate.
Beispiel :create table geom ( g geometry );
Konvertieren von ResultSet aus select g from geom Die Verwendung von JAVA für eine create table-Anweisung würde zu einem unknwon führen Datentyp für Spalte g .

Create table geom ( g UNKNOWN )

Verwenden von x(g) , y(g) Koordinatenfunktionen auf Spalte g gibt korrekte und akzeptable Datentypen zurück.
Frage select x(g), y(g) from geom wird in

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

AKTUALISIERUNG 2 :
Eine Ergebnismenge kann in Kombination mehrerer Tabellen mithilfe von Beziehungen generiert werden. Es besteht auch die Möglichkeit, dass die Ergebnismengenfelder aus Ausdrücken und ihren Aliasen bestehen. Daher werden Datentypen der resultierenden Spaltenfelder oder Aliase dynamisch entschieden. Metadaten kennen die genauen Namen von Tabellen, Spaltennamen und ihren ursprünglichen/übergeordneten Datentypen aus der Abfrage nicht.

Also ist es nicht möglich

  1. den einzelnen Namen einer Tabelle und verwenden Sie ihn.
  2. den Datentyp der übergeordneten Spalte und verwenden Sie ihn.

Hinweis Hinweis:Dies gilt auch für alle anderen datenbankübergreifenden Datentypen wie NVARCHAR , etc..Aber siehe dieses Posting für eine Alternative zur Verwendung von NVARCHAR in MySQL .

Bevor Sie eine solche dynamische Datenmigration versuchen, sollte es in der Verantwortung der Clientanwendung liegen, die entsprechenden Datentypen zu kennen und sie entsprechend zu verwenden.

Siehe auch Datentypen und -bereiche für Microsoft Access , MySQL und SQL Server für weitere Informationen.