logo
GBase 8c
适配迁移
文章

南大通用GBase 8c迁移指南之MySQL篇

GBase用户137
发表于2024-06-14 15:27:341315次浏览0个评论

本文章为基于MySQL数据库的应用系统向GBase 8c数据库迁移提供快速指导。两种数据库一些细节内容,读者可以参考MySQL官网资料( https://dev.mysql.com/doc/),以及GBase 8c用户手册来获取细节信息。迁移过程中涉及到的MySQL数据类型等基础映射,篇幅过长,本文不一一赘述。感兴趣的话打在评论区,下次讨论。

下文将介绍常用的数据库、数据表、函数、索引等基础对象相关SQL的迁移映射。

1、创建数据库

在MySQL和GBase 8c中,均使用 CREATE DATABASE 语句进行数据库的创建,具体语法区别如下:

操作

MySQL SQL语句

GBase 8c SQL语句

创建数据库

CREATE DATABASE example CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE DATABASE example OWNER gbase ENCODING ‘UTF8’ LC_COLLATE 'en_US.UTF-8'  LC_CTYPE 'en_US.UTF-8';

在进行创建数据库SQL语句迁移时需要注意的是:

(1)在MySQL 和GBase 8c中,创建数据库时均可以指定该数据库的字符集和校验规则。

区别于MySQL,在GBase 8c中可使用ENCODING 关键字指定数据库的字符集,使用LC_COLLATE及LC_CTYPE关键字指定数据库的校验规则:

  • LC_COLLATE:该参数的使用会影响到对字符串的排序顺序(如使用ORDER BY执行,以及在文本列上使用索引的顺序)
  • LC_CTYPE:该参数的使用会影响到字符的分类,如大写、小写和数字。

(2)在 GBase 8c中创建数据库时,还可以指定特有的额外属性,例如常用属性如下:

  • OWNER :该参数指定了数据库的所有者。默认缺省时,该数据库的所有者为当前用户。
  • CONNECTION LIMIT:数据库可以接受的并发连接数。系统管理员不受此参数限制。

(3)库结构

在MySQL中,database 与schema 属于同义概念,database与database之间能够关联访问。而在 GBase 8c 中,database 与schema 属于不同的数据库对象,一个database 下可以包含多个schema,并且database与database之间不能关联访问,schema与schema之间可以关联访问。

2、使用数据库

操作数据库的各类SQL语句比较:

操作

MySQL SQL语句

GBase 8c SQL语句

GBase 8c gsql工具

查看数据库

SHOW DATABASES;

SHOW DATABASE example;

SELECT * FROM pg_database;

\l 或\l+

切换数据库

USE example;

重新登录切换,该功能不使用SQL切换

\c example

删除数据库

DROP DATABASE example;

DROP DATABASE example;

3、创建数据表

在MySQL和GBase 8c中,均可以使用 CREATE TABLE 语句进行数据库的创建,具体语法区别如下:

操作

MySQL SQL语句

GBase 8c SQL语句

创建数据表 create table方式

CREATE TABLE `my_table` (

  `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',

  `user_id` int NOT NULL COMMENT '用户id',

  `name` varchar(50) DEFAULT NULL COMMENT '用户名',

  `address` varchar(50) DEFAULT NULL COMMENT '地址',

  `password` varchar(20) DEFAULT 'passwd' COMMENT '密码',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE "my_table" ( 

  "id" SERIAL NOT NULL,

  "user_id" int NOT NULL,

  "name" varchar(50),

  "address" varchar(50),

  "passwd" varchar(20) DEFAULT 'password',

  CONSTRAINT "my_table_pkey" PRIMARY KEY ("id")

);

 

COMMENT ON COLUMN "my_table"."id" IS 'id';

COMMENT ON COLUMN "my_table"."user_id" IS '用户id';

COMMENT ON COLUMN "my_table"."name" IS '用户名';

COMMENT ON COLUMN "my_table"."address" IS '地址';

COMMENT ON COLUMN "my_table"."passwd" IS '密码';

创建数据表 create table ...…like方式

create table `my_table_like` like `my_table`;

create table my_table_like (like my_table);

创建数据表 create table …… as方式

create table `my_table_as` as select * from `my_table` ;

create table my_table_as as select * from my_table ;

注意在进行创建数据表SQL语句迁移时,需要以下语法的更改:

(1)命名规则和大小写

在MySQL中,有关数据库、表名和字段的命名,会采用“` `”符号(即键盘上Esc键下面的印有~符号的键)进行标记。而这在GBase 8c中是不允许的,GBase 8c中要么使用双引号,要么直接不加任何标记。

在GBase 8c中,如果表名,字段名不加双引号,则建表的时候都会被默认转换为小写,如果需要在命名中指定为大写,则必须在该命名前后使用双引号进行标识。

 (2)存储引擎相关

  • 向GBase 8c迁移时,需要移除MySQL语句中存储元素相关子句,例如 ENGINE 和TYPE。
  • 在GBase 8c中,不支持表级别设置字符集,向GBase 8c迁移时,需要移除MySQL语句中CHARSET 相关子句。

(3)CREATE TABLE LIKE\AS

GBase 8c中也支持CREATE TABLE LIKE\AS 语法, 但在LIKE 语句的使用上与MySQL 有所不同,在GBase 8c中,LIKE 子句的前后需要使用“()”小括号进行标识,并且不会自动复制原表列上的COMMENT 注解。

4、视图相关语句

MySQL与GBase 8c 均支持视图,基本创建方式相同,但需要注意的是,在 GBase 8c 中, 默认rule下,不支持直接在视图上修改数据:

操作

MySQL SQL语句

GBase 8c SQL语句

创建视图

CREATE VIEW v_my_table AS SELECT * FROM my_table;

CREATE VIEW v_my_table AS SELECT * FROM my_table;

通过视图修改数据

INSERT INTO v_my_table(user_id,name,address) VALUES(2222,'bbb','xxxx');

支持该SQL 语法,但需要调整默认RULE

删除视图

DROP VIEW v_my_table ;

DROP VIEW v_my_table ;

5、索引相关语句

MySQL与GBase 8c 均支持索引功能,但在创建与删除操作中,有细微的差异,基本语法区别如下:

操作

MySQL SQL语句

GBase 8c SQL语句

创建索引

CREATE INDEX i_user_id USING BTREE ON my_table (user_id);

CREATE INDEX i_user_id ON my_table (user_id) USING BTREE;

CREATE INDEX i_user_id ON my_table USING BTREE (user_id);

删除索引

DROP INDEX i_user_id ON my_table;

DROP INDEX i_user_id;

在进行创建、删除索引语句迁移时需要注意的是:

(1)USING index_type 语法的位置

在MySQL中,USING index_type子句可以在 table_name(col_name) 两个子句的之前或之后的位置。形如:

... USING index_type table_name(col_name) ...

... table_name(col_name) USING index_type ...

而在GBase 8c 中,USING index_type子句需要 table_name(col_name) 子句的中间位置。

... table_name USING index_type (col_name) ...

(2)DROP INDEX ON table

在GBase 8c 中删除索引对象时,不需要指定 ON table 子句,迁移时需要进行移除。

(3)其他属性

在GBase 8c 中创建索引对象时,不支持FULLTEXT 和 SPATIAL属性,迁移时需要进行移除。

评论

登录后才可以发表评论