1. 程式人生 > >Mysql、Oracle、Sybase、Informix的一些細節區別

Mysql、Oracle、Sybase、Informix的一些細節區別

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