1、复制表结构和数据

Oracle : create table newtable as select * from oldtable

注意:Oracle语法有规定,在执行这条SQL的时候,oldtable中必须不包含long类型的字段。

Sybase : select * into newtable from oldtable

Mysql : create table newtable as select * from oldtable

Informix只支持创建复制为内存表

 

2.复制结构和数据到内存表

Oracle : create global temporary table limengzhu as select * from sunjinfu

注意:这个语法只支持复制表结构,同时不能将数据插入临时表limengzhu中,所以此用法不常用。

Mysql : create temporary table mm as select * from op_hw_ppg

提示:各个数据库都支持As Select带条件复制,如create temporary  table mm as select * from op_test_oo where birthday='19
99-09-04 09:09:00'

Informix : select * from oldtable where 1=2 into temp newtable with no log

提示 : 不写where 1=2 复制表数据和结构,写where 1=2表示只复制表结构

Sybase : select * into #newtable from oldtable

注意 : select * from #table ,查询的时候也加上#
select * into #wap2 from plmn where vendor_id=1

 

3.获取不同类型数据库中的所有表或者视图、索引

Mysql、Sybase、Informix可以通过数据库名获取,而Oracle不是采用数据库名来管理的,是通过用户模式管理。

当获取数据库的连接对象Connection conn后,利用conn.getMetaData()获取一个数据库元数据DatabaseMetaData,其中有获取当前数据库中所有表的方法(获取索引、视图可以参见JDBC)。

Mysql 、Sybase、Informix可以通过conn.getCatalog()先获取数据库名,再调用getTables()方法加载当前数据库中的所有表名。

ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types)

此时schemaPattern为空,即null。

而Oracle中不存在catalog,所以它加载表的时候,catalog参数为空,利用schemaPattern加载表,schemaPattern一般为用户名。

 

4.创建表的时候NULL与NOT NULL

对于Mysql、Oracle数据库创建表的时候未填写NULL表示可以为空,写了NULL也表示可以为空,写了NOT NULL表示该字段不可为空。

对于Sybase而言,没有显示填写字段是否为空,表示不可为空,如 create table mm(id int,name null,age not null),id,age都不可以为空,name可以为空。

而Sybase数据库,如果某个字段为空可以不填写,填写即报错,不为空可以not null,如错误的语法:create table mm(id int not null,name null),也就是说sybase不能显示指明某字段为空,正确的语法:create table mm(id int not null,name)表示id不可为空,name可以为空。

5.加减时间

Mysql:

update op_test_oo set birthday=birthday + interval 30 minute where id = 1(birthday字段加30分钟)

update op_test_oo set birthday=birthday - interval 1 hour where id = 1((birthday减一小时))

其他的语法类推。

Oracle:

修改周  update plmn set scan_start_time = scan_start_time + 1*7 where vendor_id=1
修改天数update plmn set scan_start_time = scan_start_time +(-) 1 where vendor_id = 2
修改小时 update plmn set scan_start_time = scan_start_time +(-) 1/24 where vendor_id=1
修改分钟 update plmn set scan_start_time = scan_start_time + 1/24/60 where vendor_id=1
修改秒 update plmn set scan_start_time = scan_start_time + 1/24/60/60 where vendor_id=1

提示:比如需要加5分钟,只需将60除上5,结果为12,然后数据库计算加上60/12=5分钟,update plmn set scan_start_time = scan_start_time + 1/24/(60/5) where vendor_id=1

Sybase:

update plmn set scan_start_time=dateadd(minute,+2,scan_start_time)
update plmn set scan_start_time=dateadd(month,-3,scan_start_time)  where vendor_id=8

其他的语法只需修改相应的month、minute、hour即可。

Informix :

修改分钟update plmn set scan_start_time=scan_start_time + interval(3) minute to minute where vendor_id=8(加3分钟)
修改小时update plmn set scan_start_time=scan_start_time + interval(3) hour to hour where vendor_id=8(加3小时)
修改天update plmn set scan_start_time=scan_start_time + interval(3) day to day where vendor_id=8(加3天)

其他的语法类推。

6.表名、数据库名、字段名大小写

Sybase中字段名区分大小写,Oracle中表名都为大写,Informix中表名都为小写。

比如Informix,建表的时候即使指明为大写,表成功建立后Informix自动将其转为小写,但是在插入数据的时候insert into table,这个table可以是大写。

7、关于时间类型值

这里只说标准型的时间数据问题,如2012-03-26 15:00:00

Mysql中有datetime、timestamp类型,其中datetime可以为空,但是timestamp不可为空,默认值是当前时间

Mysql、Sybase、Informix中的时间值数据均可以以字符串的形式插入其中,只支持两种标准的格式2012-03-26 15:00:00和2012/03/26 15:00:00,也可以有精度的比如:2010-01-23 10:10:10.0

而Oracle中没有datetime类型,有timestamp,timestamp不能指明列宽时间必须利用函数to_date()转换,to_date('2009/03/19 17:03:00' , 'yyyy-mm-dd hh24:mi:ss')

to_date('2009/06/19 17:03:00.0' , 'yyyy-mm-dd hh24:mi:ss')会报错,时间格式不能出现最后那个.0。

informix带有时间字段的类型建表的时候要注意加上YEAR TO FRACTION(2)等,如下:

ONETIME INTERVAL HOUR(2) TO SECOND,
BIRTHDAY DATETIME YEAR TO FRACTION(2))

8.建表语句的其他一些问题

Mysql中的varchar必须指明列宽,而Informix中的varchar可以不指明列宽。大部分数据库,一般可以指明列宽的常见字段类型为

float 、varchar、numeric、decimal,int 或者integer一般不可以指明列宽。

sybase 不支持DROP TABLE  IF EXIST ...............