本篇文章来自南大通用GBase技术社区,更多精彩内容请访问 https://www.gbase.cn/community
在信息技术迅猛发展的今天,数据库迁移是一个复杂但必要的过程,它涉及到详细的规划、周密的执行和严格的测试。从达梦数据库到南大通用GBase 8s的迁移,不仅是技术平台的变更,更是企业数据战略的一次重要调整。通过这次迁移,企业将能够更好地应对大数据时代的挑战,实现数据价值的最大化。本文将深入探讨两种数据库系统之间的基础功能项及语法等差异,了解这些差异对于确保数据的完整性和迁移的顺利进行至关重要,本系列的文章将为您提供一份详尽的迁移指南。
一、表差异描述
在数据库迁移过程中,表结构的转换是核心任务之一。表差异主要体现在数据类型、自增列的实现上。以下是达梦数据库(DM)与南大通用GBase 8s在表创建和使用上的基础功能项语法差异的详细描述:
1、数据类型差异
数据类型是数据库设计的基础。GBase 8s与DM在数据类型上存在一定的差异,例如时间类型、浮点数和位字段等,正确处理这些差异是迁移的第一步。
DM | GBase 8s |
int | int |
char(10) | char(10) |
varchar | varchar |
numeric(5,2), | numeric(5,2), |
smallint | smallint |
bigint | bigint |
byte | byte |
binary | binary18 /binaryvar(255) |
float | Float/double precision |
double | Float/double precision |
real | real |
Bit(一般是一位二进制用来表示标志位或者布尔值) | Binaryvar(1) |
date | date |
time | datetime hour to second |
timestamp | datetime year to fraction(5) |
interval year to month | interval year to month |
time with time zone | datetime hour to fraction(5) |
text | text |
image | blob |
blob | blob |
clob | clob |
2、自增列的实现
自增列是一种特殊的列类型,通常用于生成唯一的序列号。DM和GBase 8s在自增列的实现上有所不同:
- 在DM中,使用 identity关键字定义自增列,例如 c1 int identity(1,2),其中1是种子值,2是增量值。DM支持查看自增列当前值、种子值、增量值,类似8s序列的功能。
create table FUT_BGL_CKZZL(c1 int identity(1,2), c2 char);
- 在GBase 8s中,使用 `serial` 关键字来定义自增列,例如 c1 int serial,其效果与DM中的 identity 类似。
create table FUT_BGL_CKZZL(c1 int serial, c2 char);
二、约束定义差异
约束用于确保数据库中数据的准确性和完整性。DM和GBase 8s在约束的定义和操作方式上存在差异:
1、启用、禁用约束
- DM
ALTER TABLE FUT_YS_QYJY DISABLE CONSTRAINT T_CON_PK;
- GBase 8s
SET CONSTRAINTS T_CON_PK DISABLED;
2、修改约束
- DM
alter table FUT_YS_XG add constraint con_c1 primary key(c1);
- GBase 8s
alter table FUT_YS_XG add constraint primary key(c1) constraint con_c1;
三、分区表操作
分区表可以提高查询性能和数据管理的灵活性。GBase 8s支持间隔分区、组合分区以及分区的增加、合并、拆分和截断等操作,这些操作在语法上与DM有所区别。
1、间隔分区
DM使用 NUMTOYMINTERVAL 函数定义时间间隔,而GBase 8s使用 NUMTOYMINTERVAL`函数并结合环境变量和SQL模式来实现类似的功能。
- DM
reate table FUT_FQB_CJJG (ts timestamp,data varchar(20)) partition by range(ts)
interval(NUMTOYMINTERVAL(1,'month'))
(partition p0 values less than(to_date('2010-01-01','yyyy-mm-dd')));
- GBase 8s
export GL_DATE='%iY-%m-%d'
Set environmnet sqlmode ‘oracle’;
create table FUT_FQB_CJJG (ts datetime year to fraction(5),data varchar(20)) partition by range(ts)
interval(NUMTOYMINTERVAL(1,'month'))
partition p0 values <(date('2010-01-01')) in datadbs1 ;
2、组合分区(二级分区)
DM支持使用 list和 range 以及 subpartition关键字来创建组合分区,GBase 8s也支持类似的语法,但在具体实现上可能有所区别。
- DM
create table "SYSDBA"."T_FUT_FQB_CJZH"
(
"C1" CHAR(10),
"C2" INT,
"C3" CHAR(10)
)
partition by list("C1")
subpartition by range("C2")
subpartition template
(
subpartition "PART_1" values less than(10) storage(on "TS1_FUT_FQB_CJZH"),
subpartition "PART_2" values less than(20) storage(on "TS2_FUT_FQB_CJZH"),
subpartition "PART_3" values less than(MAXVALUE) storage(on "TS3_FUT_FQB_CJZH")
)
(
partition "PART_1" values('A') storage(on
"TS1_FUT_FQB_CJZH"),
partition "PART_2" values('B') storage(on
"TS2_FUT_FQB_CJZH"),
partition "PART_3" values('C') storage(on
"TS3_FUT_FQB_CJZH")
);
- GBase 8s
create table T_FUT_FQB_CJZH
(
C1 CHAR(10),
C2 INT,
C3 CHAR(10)
)
partition by list(C1)
subpartition by range(C2)
(
partition PART_1 values('A')
(
subpartition PART_1_1 values less than(10)
),
partition PART_2 values('B')
(
subpartition PART_2_1 values less than(20)
),
partition PART_3 values('C')
(
subpartition PART_3_1 values less than(MAXVALUE)
)
)
;
3、增加分区、合并分区、拆分分区、截断分区
- DM
alter table FUT_FQB_ZJ add partition p5 values less than (maxvalue);
alter table FUT_FQB_CJFW merge partitions p3,p4 into partition p3_4;
alter table FUT_FQB_CJFW split partition p2 at('2012-4-1') into (partition p21,partition p22);
alter table FUT_FQB_JD truncate partition(p4);
- GBase 8s
alter FRAGMENT on table FUT_FQB_ZJ add partition p5 values less than (maxvalue);
alter FRAGMENT on table FUT_FQB_CJFW merge partitions p3,p4 into partition p3_4;
alter FRAGMENT on table FUT_FQB_CJFW split partition p2 at('2012-4-1') into (partition p21,partition p22);
ALTER FRAGMENT ON TABLE FUT_FQB_JD TRUNCATE PARTITION p4;
4、分区表行迁移
- DM
create table FUT_FQB_HQY (c1 int , c2 varchar(10), c3 date)partition by range(c3)(partition p1 values less than ('2012-3-1'),partition p2 values less than ('2012-6-1'),partition p3 values less than ('2012-9-1'),partition p4 values less than (maxvalue))enable row movement;
alter table FUT_FQB_HQY split partition p4 at('2012-12-1') into (partition p41,partition p42);
- GBase 8s
create table FUT_FQB_HQY (c1 int , c2 varchar(10), c3 date)partition by range(c3)(partition p1 values less than ('2012-3-1'),partition p2 values less than ('2012-6-1'),partition p3 values less than ('2012-9-1'),partition p4 values less than (maxvalue));
alter FRAGMENT on table FUT_FQB_HQY split partition p4 at('2012-12-1') into (partition p41,partition p42);
5、自动创建分区
- DM
create table FUT_FQB_ZD
( seq number not null,update_time date,
constraint FUT_FQB_ZD_SEQ primary key(seq)
)
partition by range(update_time)
interval(numtoyminterval(3,'month'))
( partition FUT_FQB_ZD1 values less than('2016-01-01'));
- GBase 8s
create table FUT_FQB_ZD
( seq number not null,
update_time date,
constraint FUT_FQB_ZD_SEQ primary key(seq)
)
partition by range(update_time)
interval(numtoyminterval(3,'month'))
partition FUT_FQB_ZD1 values <('2016-01-01') in datadbs1;
以上本文从表、约束、分区表操作等方面,描述了达梦数据库(DM)与南大通用GBase 8s的详细差异。下篇文章我们来说说索引、触发器和存储过程。感谢您的阅读,对于本文内容或数据库迁移的任何问题,欢迎在评论区留言,我们的技术专家将为您提供解答。