/* * JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jef.database.meta; /** * 这个类列举各种和数据库相关的特性 * @author jiyi * */ public enum Feature { /** * 必须使用sequence才能实现自增,即表本身不支持自增列 (Oracle) * * Postgres虽然也必须使用Sequence,但是其支持serial数据类型(即default表达式 nextval('seq_name'); )模式,因此框架处理时认为 * postgresql是可以无须SEQUENCE的。 */ AUTOINCREMENT_NEED_SEQUENCE, /** * Postgres专用特性,Postgresql的表关于自增有两种可能,一种情况下用户使用 default nextval('seq_name')作为主键的缺省值,模拟出了表自增的效果。 * 一种是没有模拟的和Oracle类似,由于无法控制用户建表的方法,因此两种情况都有可能存在。 * 因此特地增加这一选项,在每个表处理中检查该表的字段缺省值,用于强行确定到底是属于那种情况。 */ AI_TO_SEQUENCE_WITHOUT_DEFAULT, /** * 允许使用Rownum/支持rowUID来限定结果数量 特别SQL语法特性(Oracle) */ SELECT_ROW_NUM, /** * 用户名作为Schema (Oracle) */ USER_AS_SCHEMA, // /** * 数据库名作为Schema或catlog (MySQL) */ DBNAME_AS_SCHEMA, // /** * 允许使用NULL在列定义中 */ COLUMN_DEF_ALLOW_NULL, /** * ResultSet只能向前滚动,不支持向后滚动结果集(SQLlite) */ TYPE_FORWARD_ONLY, /** * 不支持元数据中的INDEX查询(SQLlite) */ NOT_SUPPORT_INDEX_META, /** * 自增列必须为主键,某些数据库只支持将主键定义为自增(SQLlite) */ AUTOINCREMENT_MUSTBE_PK, /** * 支持级联删除所有外键(Oracle) */ DROP_CASCADE, /** * 是否支持用||表示字符串相加。 * 如果没有这个特性的话,JEF就只能将字符串修改为concat(a,b,c...)的函数了 (Oracle) */ SUPPORT_CONCAT, /** * SQLServer特性,不支持||表示字符串相加,而是用+表示 */ CONCAT_IS_ADD, /** * Oracle特性,支持 start with ... connect by ....类型的语句 */ SUPPORT_CONNECT_BY, /** * * 在CASE WHEN THEN ELSE END这个系列的语法中,Derby的语法和别的数据库是不一样的。不允许在case后面写switch条件,而必须在每个when后面写条件表达式 * (Derby) */ CASE_WITHOUT_SWITCH, /** * 当批量插入时,使用JDBC getGeneratedKeys方法只能返回自增值的最后一个。 * Abbout derby Bug: https://issues.apache.org/jira/browse/DERBY-3609 Since * Derby return generated keys feature implement partially * (Derby,Sqlite) */ BATCH_GENERATED_KEY_ONLY_LAST, /** * SQLServer特性,Batch模式下使用getGeneratedKeys无法正常返回主键值,所以不得不使用@@IDENTITY返回结果 */ BATCH_GENERATED_KEY_BY_FUNCTION, /** * 要想从元数据中获取备注需要特别的参数才行(Oracle) */ REMARK_META_FETCH, /** * Derby和Postgres特性,alter table语句中修改列支持必须用更复杂的语法 * column-alteration syntax * key words must * column-Name SET DATA TYPE VARCHAR(integer) | * column-Name SET DATA TYPE VARCHAR FOR BIT DATA(integer) | * column-name SET INCREMENT BY integer-constant | * column-name RESTART WITH integer-constant | * column-name [ NOT ] NULL | * column-name [ WITH | SET ] DEFAULT default-value | * column-name DROP DEFAULT */ COLUMN_ALTERATION_SYNTAX, /** * 在执行ALTER TABLE语句的时候一次只能操作一个列 (Derby) */ ONE_COLUMN_IN_SINGLE_DDL, /** * 必须将改表语句中的多列用括号起来,不然报错(Oracle) */ BRUKETS_FOR_ALTER_TABLE, /** * 在一个alter table中可以操作多个列,但是每列的前面要加上命令(MYSQL, POSTGRES) */ ALTER_FOR_EACH_COLUMN, /** * Apache Derby上,如果调用ResultSet.newRecord()创建记录,下次正常插入记录时该表中自增主键会冲突。 */ NOT_FETCH_NEXT_AUTOINCREAMENTD, /** * 游标操作特性,在游标上直接插入记录时是限制 */ CURSOR_ENDS_ON_INSERT_ROW, /** * 支持Sequence */ SUPPORT_SEQUENCE, /** * 支持Limit限定结果 */ SUPPORT_LIMIT, /** * 不支持Truncate语句 */ NOT_SUPPORT_TRUNCATE, /** * 不支持外键,目前SQLite按不支持外键处理,其驱动不够健壮 */ NOT_SUPPORT_FOREIGN_KEY, /** * 不支持在Like语句中使用Escape语句作为转义 * (暂无数据库有此特性) */ NOT_SUPPORT_LIKE_ESCAPE, /** * 不支持插入时使用DEFAULT关键字 (SQLite) */ NOT_SUPPORT_KEYWORD_DEFAULT, /** * 不支持获取用户函数(SQLite) */ NOT_SUPPORT_USER_FUNCTION, /** * SQLite操作Blob时,不支持setBinaryStream,必须用setBytes * (SQLite) */ NOT_SUPPORT_SET_BINARY, /** * 不支持修改表删除字段 * (SQLite) */ NOT_SUPPORT_ALTER_DROP_COLUMN, /** * Union语句上每个子句两边加上括号 * (Derby) */ UNION_WITH_BUCK, /** * Oracle特性,长度为0的字符串为null值 */ EMPTY_CHAR_IS_NULL, /** * 支持COMMENT ON TABLE/COLUMN IS ''语法 */ SUPPORT_COMMENT, /** * MYSQL语法,建表时语句在字段上直接加COMMENT语句 */ SUPPORT_INLINE_COMMENT, }