sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit tabulku založenou na sadě výsledků JDBC

Můžeme extrahovat nejbližší shodu strukturu z výsledkové sady a vytvořte tabulku.
Ale toto nemůže být přesná replika, pokud jde o název tabulky, klíče, typ motoru, zda je pole s možnou hodnotou Null nebo ne atd. .

Následující fragment kódu vám pomůže postupovat tak, abyste získali vhodný výsledek.

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

Probíhá s výše uvedenou částí kódu, vytiskne se následující řetězec:

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

Doufám, že vám to pomůže v dalším postupu.

Podobný příklad lze nalézt na: Vytvořte tabulku pomocí ResultSet ???

AKTUALIZACE 1 :

Pokud jste závislí pouze na sadě výsledků v klientské aplikaci, nemůžete nic dělat.
Vždy by to měl být hlavní výběrový dotaz který vybere správná data ze složeného datového typu, jako je geometry , address atd.
Příklad :select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )

Uvedeme příklad geometry datový typ :
MySQL má definice pro svůj Prostorová podpora . Nejsem si ale jistý, jak dalece jsou dobré ve srovnání s SQL Serverová implementace prostorových dat .

geometry je složený datový typ, a proto jej nelze načíst přímým dotazem.
Požadujete závislé funkce, které analyzují data z takových datových sloupců a vrátí je v čitelném , identifikovatelné datové formáty.
Příklad :create table geom ( g geometry );
Převod sady výsledků z select g from geom použití JAVA k vytvoření tabulky by mělo za následek unknwon datový typ pro sloupec g .

Create table geom ( g UNKNOWN )

Pomocí x(g) , y(g) souřadnicové funkce ve sloupci g vrátí správné a přijatelné datové typy.
Dotaz select x(g), y(g) from geom bude převeden na

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

AKTUALIZACE 2 :
Výsledková sada může být generována v kombinaci více tabulek pomocí relací. Existuje také šance, že pole resultset se skládají z výrazů a jejich aliasů. Datové typy výsledných sloupcových polí nebo aliasů se tedy rozhodují jako dynamické. Metadata nezná přesné názvy tabulek, názvy sloupců a jejich původní/nadřazené datové typy z dotazu.

Takže není možné získat

  1. jediný název tabulky a jeho použití.
  2. datový typ nadřazeného sloupce a jeho použití.

Poznámka :Toto platí také pro všechny ostatní datové typy specifické pro různé databáze, jako je NVARCHAR , atd..Ale podívejte se prosím na tento příspěvek, kde najdete alternativu k použití NVARCHAR v MySQL .

Než se pokusíte o takovou dynamickou migraci dat, měla by být odpovědností klientských aplikací znát ekvivalentní datové typy a odpovídajícím způsobem je používat.

Viz také Datové typy a rozsahy pro Microsoft Access , MySQL a SQL Server pro více informací.



  1. node-mysql více příkazů v jednom dotazu

  2. Oracle - Materialized View je stále dostupný během úplného obnovení. Jak to funguje?

  3. MySQL ekvivalent Oracle SEQUENCE.NEXTVAL

  4. Jak převést řetězec na datum/čas na serveru SQL pomocí CONVERT()