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 ...............