我们可以从结果集中提取最近的匹配结构并构造一个表。
但这不可能是精确的副本,就表名、键、引擎类型、字段是否可为空等而言。
以下代码片段可帮助您以某种方式继续获得适当的结果。
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() );
使用上述部分代码执行,打印以下字符串:
Create table visitors ( ip VARCHAR( 6 ), bro VARCHAR( 6 ) )
让我希望这可以帮助您进一步进行。
类似的示例可以在以下位置找到:使用 ResultSet 创建表???
更新 1:
我如何处理只存在于一个数据库中而不存在于另一个数据库中的类型
仅依赖于客户端应用程序的结果集时,您无能为力。
它应该始终是从复合数据类型(如,等)中选择适当数据的主选择查询。示例:geometry
address
select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )
举一个geometry
数据类型的例子:
MySQL 有对其空间支持的定义。但我不确定它们与SQL Server 的 Spatial Data 实现相比有多好。
geometry
是一种复合数据类型,因此不能通过直接查询来检索。
您需要从这些数据列解析数据并以可读、可识别的数据格式返回的依赖函数。
示例:create table geom ( g geometry );
将 ResultSet 从select g from geom
使用 JAVA 转换为 create table 语句将导致unknwon
列的数据类型g
。
Create table geom ( g UNKNOWN )
在列上使用x(g)
,y(g)
坐标函数g
将返回正确且可接受的数据类型。
查询select x(g), y(g) from geom
将转换为
Create table ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) )
更新 2:
可能会使用关系结合多个表生成结果集。结果集字段也有可能由表达式及其别名组成。因此,生成的列字段或别名的数据类型是动态确定的。元数据不知道查询中的表、列名及其原始/父数据类型的确切名称。
所以,无法获得
- 表的单一名称并使用它。
- 父列的数据类型并使用它。
注意:这也适用于所有其他跨数据库特定数据类型,例如NVARCHAR等。但是,请参阅此帖子以了解 MySQL 中 NVARCHAR 用法的替代方法。
在尝试这种动态数据迁移之前,客户端应用程序应该有责任了解等效的数据类型并相应地使用它们。
此外,有关更多信息,请参阅Microsoft Access、MySQL 和 SQL Server 的数据类型和范围。