在derby中描述和选择表不会使用与create相同的列顺序

时间:2012-08-23 10:43:29

标签: java derby

我在derbyDB中遇到过有趣的行为。

我使用以下SQL创建一个表(来自java代码)...

Create Table S1.SortieDessai (OBS VARCHAR(9), DateDUSortie TIMESTAMP, ContreIndic BOOLEAN,
Fin BOOLEAN, PdeVu VARCHAR(255), Refus LONG VARCHAR , InvDecisn LONG VARCHAR ,
Admin LONG VARCHAR , Motif_de_la_sortie VARCHAR(255), NomValidee VARCHAR(255),
DateValidee TIMESTAMP )

然而,当我从ij打电话给我时,我得到以下内容......

ij> describe sortiedessai;
COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
OBS                 |VARCHAR  |NULL|NULL|9     |NULL      |18        |YES
CONTREINDIC         |BOOLEAN  |NULL|NULL|1     |NULL      |NULL      |YES
FIN                 |BOOLEAN  |NULL|NULL|1     |NULL      |NULL      |YES
PDEVU               |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
REFUS               |LONG VAR&|NULL|NULL|32700 |NULL      |NULL      |YES
INVDECISN           |LONG VAR&|NULL|NULL|32700 |NULL      |NULL      |YES
ADMIN               |LONG VAR&|NULL|NULL|32700 |NULL      |NULL      |YES
MOTIF_DE_LA_SORTIE  |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
NOMVALIDEE          |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
DATEDUSORTIE        |DATE     |0   |10  |10    |NULL      |NULL      |YES
DATEVALIDEE         |DATE     |0   |10  |10    |NULL      |NULL      |YES

当我选择*时,报告列的顺序与上述描述相同。

当将表从一个DBMS复制到另一个DBMS时,这导致了一个问题。另一个DBMS(Ms Access)按照create语句的顺序报告列名,所以当我执行插入操作时,我不能依赖于Derby中的顺序是“正确的”,如Access所报告的,这意味着我必须玩更多地获得一个良好的订单,然后获得按顺序插入的值,不是很大的困难,而是加剧。

当我创建表时,我在创建语句的开头放置了我想要查看的信息,假设任何 select * 命令将以相同的顺序吐出结果。

这引出了几个问题。

我可以告诉derby以特定顺序(即创建顺序)报告某个设置中的表吗? 德比是做一些奇怪的行为,这是一个错误,还是它是关于语句对象的东西? (我已经尝试了statement.execute(sqlString)和statement.executeUpdate(sqlString),两者似乎都有相同的效果 - 我假设它是一个java的东西,就好像我在ij中创建表一切正常正确的顺序。

derby如何确定如何报告任何给定表中列的顺序,它看起来像是随机的,但无论我在create语句中使用该列的顺序,describe始终都是相同的!

注意:我已经意识到Access确实习惯于将一些信息吐出一个看似完全随机的顺序(即databaseMetaData中的表名列表从不以相同的顺序输出,但resultSetMetadata似乎是正确的排序)。

任何想法都会被大家接受

部分解决方案和更多信息。 请参阅我有关使用数组存储列名称顺序和以相同顺序访问数据的注释。它不是很“好”,但它解决了这个问题。 我还应该补充一点,我测试我的数据(它肯定来自ms Access源)并在某些情况下确认正确的类型(即,Access中的单个日期时间很容易映射到时间戳/日期/时间)。 所以我修改了列的数据类型。显然,这种修改通过添加和删除列来改变结构,这也有助于弄乱初始插入的“结构化”顺序。 在我有机会编写一个propper测试用例之前,我不能保证这不是我问题的根本原因!

1 个答案:

答案 0 :(得分:0)

很奇怪,顺序取决于您是通过ij创建表,还是从Java程序创建表。如果你可以将它与一个简单的测试用例隔离开来,你应该考虑将它作为一个bug报告给Derby开发人员,因为我认为不应该这样。

要深入挖掘详细信息,请尝试查看在SYSCOLUMNS系统表中列出列的方式,特别是该表中COLUMNNUMBER列的值。

http://db.apache.org/derby/docs/10.9/ref/rrefsistabs22441.html

在ij中创建表而不是Java应用程序时,在SYSCOLUMNS表中获得相同的结果吗?

相关问题