HSQLDB中文文档第二章2

779 篇文章 0 订阅
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

  由于种种原因,最近没有开工,这一部分基本上是由jekey@163.com翻译的,在此谢谢他的支持。要下载全文,请到HSQLDB%d3%c3%bb%a7%d6%b8%c4%cf.pdf" />http://foas.blogchina.com/inc/HSQLDB%D3%C3%BB%A7%D6%B8%C4%CF.pdf

  或者HSQLDB" />https://gro.clinux.org/docman/view.php/763/308/HSQLDB用户指南.pdf

  谢谢大家的支持。

  2.4类型和算术操作

  HSQLDB支持的所有类型的数据库表都可以被索引,也可以进行比较。所有的类型都可以用CONVERT()库函数进行显示转换,但是在大多数情况下它们可以被自动的转换。不推荐在LONGVARBINARY,LONGVARCHAR和OTHER列使用索引,因为这些索引可能在将来的版本中是不允许的。

  早期版本的HSQLDB在算术操作的处理上有些不足。例如,不可能把10/2.5插入到任何DOUBLE或者DECIMAL列。在1.7.0版本中,遵循下列规则的全操作(fulloperations)是可能的:

  TINYINT,SMALLINT,INTEGER,BIGINT,NUMBER和DECIMAL(没有小数点)是HSQLDB支持的整值类型,它们在Java中被映射成byte,short,int,long和BigDecimal。SQL类型规定了最大值和最小值,这些值可以存在于(beheld)每一个类型的一个域(field)里面。例如,TINYINT的值范围是从-128到+127,虽然实际用于处理TINYINT类型的Java类型是java.lang.Integer。

  REAL,FLOAT,DOUBLE在Java中都被映射成double。

  DECIMAL和NUMERIC被映射成java.math.BigDecimal,它们可以有很多的位数。

  2.4.1整型类型

  TINYINT,SMALLINT,INTEGER,BIGINT,NUMBER和DECIMAL(不带小数点)在内部都是完全可以互换的,不存在数据窄化(narrowing)的情况。根据不同的操作数类型,返回的操作结果是以任何相关的Java类型(Integer,LongorBigDecimal)存在于JDBC结果集中的。只要返回值可以被结果类型所表示,ResultSet.getXXXX()方法就能够用来获取数据同时返回值也可以被结果类型描述。这个类型是基于查询的,而不是实际返回的列。当返回一行的相同查询因往数据库的表中添加了更多数据之后返回多行记录的时候,返回的类型不发生变化。

  如果SELECT语句涉及到一个单列或者一个函数的话,那么返回类型就是所对应的列或者函数的返回类型。例如:

  CREATETABLEt(aINTEGER,bBIGINT);

  SELECTMAX(a),MAX(b)FROMt;

  将会返回一个结果集,其第一列的类型是java.lang.Integer,第二列的类型是java.lang.Long。然而,

  SELECTMAX(a)+0,MAX(b)+0FROMt;

  将返回java.lang.Long和BigDecimal的值,它是作为所有返回值的统一类型的提升生成的。

  在表达式中的中间整形数值的大小上,没有内建的限制。因此,你应该检查结果集列的类型,选择一个合适的getXXXX()方法来获取该值。另外你也可以使用getObject()方法,然后,将结果转换成java.lang.Number,在结果上使用intValue()或longValue()方法。

  当表达式的结果存在在数据库表的一个列中,它必须适合目标列,否则,会返回一个错误。例如,当计算1234567890123456789012/12345687901234567890时,结果可以被存储在任何类型的列中,甚至是个TINY列,因为它是一个很小的值。

  2.4.2其他数据类型

  在SQL语句中,除非带有额外的说明,带有小数点的数字都被当作DECIMAL处理。因此0.2被认为是DECIMAL类型的值,而0.2E0则被看作DOUBLE类型。

  当对某个值使用PreparedStatement.setDouble()或setFloat()方法时,该值就被自动默认为DOUBLE类型处理。

  当表达式的一部分是REAL、FLOAT或者DOUBLE(所有同义的类型)类型时,那么结果类型则是DOUBLE。

  此外,当DOUBLE类型不存在时,如果表达式的一部分是DECIMAL或NUMERIC类型时,结果类型就是DECIMAL。结果可以按照需要的类型从ResultSet中取出,同时也可以被再定义。这就意味着如果一个DECIMAL值的范围在Double.MIN_VALUE-Double_MAX_VALUE之间,那么它就可以被转换成DOUBLE类型。和整形数值相似,当表达式结果存入表的列中时,它的类型必须符合该列的类型,否则将有错误出现。

  进行除法运算时,DOUBLE和DECIMAL类型间的区别就显得很重要的。当操作数类型是DECIMAL,结果是一个带有取值范围(小数点右边的位数)的数据,那么就取两个操作数中范围中较大的。如果是DOUBLE类型,那么范围则是运算的精确结果。例如,10.0/8.0(DECIMAL)等于1.2,但是10.0E0/8.0E0(DOUBLE)等于1.25。如果不是除法运算,DECIMAL类型能精确的描述算法;如果两个相乘,那么范围就是两个数范围的和。

  REAL、FLOAT和DOUBLE类型数值都被当作java.long.Double对象存入数据库中。同时也可以存储和支持一些特殊值如NaN和正负无穷。这些值可以通过JDBCPreparedStatement方法提交给数据库,并且可以以结果集对象返回。

  2.4.3二进制和Boolean类型

  从1.7.2开始,BIT通常也可以看作BOOLEAN的化身。BOOLEAN列的主要描述是’true’或’false’,通过JDBC使用时,可以被看作boolean或者String类型。BOOLEAN列的类型还可以使用任何数字类型的值进行初始化。这样的情况下,0将被转化成false,其他非0值将被转换成true。

  从1.7.3开始,BOOLEAN类型除了支持TRUE和FALSE类型以外,也提供了对UNDEFINED状态的支持,从而与SQL标准取得了一致。NULL值被当作没定义类型处理。这一改进影响了那些包含NOTIN的查询。这样的查询语句,请参看测试文本文件TestSelfNot.txt。

  2.4.4Java对象的存储和操作

  从1.7.2开始,对Java对象的存储和操作的支持有了很大的提高,通过使用任一个改变了的PreparedStatement.setObject()方法,任一个序列化的JAVA对象都可以被直接的插入到OTHER类型的列中。

  为了比较参照,在索引里边,任何两个Java对象都被看作是相等,除非他们中的一个是NULL。在OTHER类型的列中,你不能搜索一个指定的对象或者进行连接操作。

  请注意,HSQLDB不是一个对象-关系数据库。Java对象只是在内部存储,除了在OTHER类型列之间分配或测试是否为NULL之外,不能对他们进行其他的操作。测试例如WHEREobject1=object2,或者WHEREojbect1=?并不能得到你预期的结果。任何非空的对象都能满足这样的测试。但是WHEREobject1ISNOTNULL就能很好的执行。

  正规列的数据被分配给Java对象列(例如该列被分配整型或字符串时的SQL语句如UPDATEmytableSETobjectcol=intcolWHERE…)时并不会返回错误,但在将来,这样的做法时很不赞成的。因此请使用OTHER类型列来存贮对象而不是其他类型的数据。

  2.4.5类型的大小、精度和范围

  在1.7.2版本以前,所有表中对一个列的大小、精度或范围的限制的类型定义是可有可无的。

  在1.8.0版本中,这样的限定必须和SQL标准一致。例如INTEGER(8)这样的形式将不能被接受。除非设置了数据库的属性,这个限定仍然是可有可无的。SETPROPERTY”sql.enforce_strict_size”TRUE语句将为CHARACTER或VARCHAR列强制设置大小,并且当插入或更新一个CHARACTER列时填充字符串。精度和范围限制也被强加给DECIMAL和NUMERIC类型。TIMESTAMP只能使用0或6这样的精度。

  如你所料,将一个值转换成一个限定的CHARACTER类型将导致切割或填充。因此象CAST(mycolASVARCHAR(2))=’xy’这样的测试语句结果得到以xy开头的值。这和SUBSTRING(mycolFROM1FOR2)=’xy’是相同的。

  2.5序列和标识

  SEQUENCE关键字作为SQL200n标准语法的子集被引入到1.7.2版本中。相应的,IDENTITY列的SQL200n语法也被引进。

  2.5.1标识自动增长列

  每个表都可以有一个自动增长列,众所周知的就是IDENTITY列。一个IDENTITY列总是被当作表的主键处理(因此,多列主键不可能有一个IDENTITY列)。作为一个捷径,已经为CREATETABLE( IDENTITY,…)提供了支持。

  从1.7.2版本开始,SQL标准语法默认的支持指定初始值。支持的形式是:( INTEGERGENERATEDBYDEFAULTASIDENTITY(STARTWITHn,[INCREMENTBYm])PRIMARYKEY,...).。同时也对BIGINT特性列提供了支持。因此,一个IDENTITY列和一个自动顺序的产生默认值的INTEGER或者BIGINT列很相似。

  当使用INSERTINTO…语句向表中添加一个新列时;你可以在IDENTITY列中使用NULL值,这样将为列产生一个自动生成的值。IDENTITY()函数返回通过连接插入到IDENTITY列中的最后一个值。使用CALLIDENTITY()这个SQL语句取得这个值。如果想在子表中使用这个值,你可以使用语句INSERTINTO VALUES(...,IDENTITY(),...);。在任何附加的更新或插入语句在数据库中执行前,调用IDENTITY()函数的类型必须被确定。

  接下来要使用的的IDENTITY值可以通过语句ALTERTABLEALTERCOLUMN RESTARTWITH ;来设置。

  2.5.2序列

  SQL200n语法和用法和现有的大多数据库引擎所支持的是有区别的。Sequences通过命令CREATESEQUENCE创建并且他们的当前值可以通过命令ALTERSEQUENCE在任何时候进行修改。一个sequence的下一个值是通过NEXTVALUEFOR 表达式取得。这个表达式可以用来插入或者更新表的行,你也可以在select语句中使用它。例如,如果想计算在一个Sequence序列中SELECT返回的行,可以使用:

  例2.3计算选择操作以后返回的行

  SELECTNEXTVALUEFORmysequence,col1,col2FROMmytableWHERE...

  请注意,顺序的语义并不合SQL200n定义的完全相同。例如,如果你在相同的列插入操作中两次使用相同的序列,你将会得到两个不同的值,而不是标准所说的同一个值。

  你可以通过查询SYSTEMSEQUENCES表得到下一个值,这个值将从任何定义的序列中返回。SEQUENCE_NAME列保存了名称,NEXT_VALUE列保存了下一个被返回的值。

  2.5.3事务的问题

  HSQLDB在READ_UNCOMMITTED级别上支持事务,就象0级别上的事务隔离。这就意味着在一个事务的生命周期内,其他数据库的连接可以看到这个事务对数据的改变。总的来说,对事务的支持还是不错的。象如果数据库突然关闭而事务被提交这样的BUG已经被修复了。然而,对于多个连接同时使用事务连接到数据库这样的问题就比较麻烦了。

  如果两个事务修改同一行,而两个事务提交时没有异常出现。这样的情况可以通过设计应用程序数据的一致性不依赖通过事务对数据修改的独占性这样的数据库而避免。你可以通过设置一个数据库属性,从而在这样的情况发生时会产生一个异常:SELECTNEXTVALUEFORmysequence,col1,col2FROMmytableWHERE...

  当一个ALTERTABLE…INSERTCOLUMN或者DROPCOLUMN命令导致数表的结构变化时,当前的会话被提交。如果一个未授权的事务此时通过另一个连接改变表中的数据,那么这个事务在ALTERTABLE命令前不应被回滚。这一点同样也适用于ADDINDEX或ADDCONSTRAINT命令。只有在其他连接没有使用事务时,才推荐使用ALTER等这样的命令。

  在CHECKPOINT命令运行以后,未授权事务才能继续运行、提交或回滚。然而,如果数据库并没有使用SHUTDOWN命令正常的关闭的话,任何事务在数据库关闭时仍被看作是未授权的,将被看作下次启动数据库以后的事务(在CHECKPOINT的状态)的一部分。无论程序中没有未授权的事务,还是知道事务不会因为持续过长时间而发生的非正常关闭影响数据,都推荐使用CHECKPOINT。

  2.5.4新特性和变化

  在最新的1.8.0版本中增加了许多更好的对SQL的支持。这些都在SQL语法这一章和文件../changelog_1_7_2.txt中列出了。象POSITION(),SUBSTRING(),NULLIF(),COALESCE(),CASE...WHEN..ELSE,ANY,ALL这样的表达式和函数也在其中。另外一些改进虽然在文档中不是很明显,但能使数据库性能比以前版本有很大的改进。这其中最重要的就是能在连接(join)和外连接(OUTERjoins)中处理NULL值。你应该对使用新版本数据库引擎的应用程序进行测试,确定这些程序不再使用旧版本的那些错误的特性。在将来的版本中,数据库引擎仍将朝着完全支持SQL标准的方向改进,因此最好不要依赖当前版本中任何的非标准特性。

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值