一、前言
最近需要把mysql数据库中的表迁移到DB2数据库,表内的数据用kettle可以实现迁移,但是建表语句却怎么也搞不好。
百度半天,发现并没有什么好的方法或工具能把mysql建表语句转成DB2。
Mysql建表语句想转成DB2,似乎只能自己手写。
然后就踩了一堆坑,用时2天,总算搞定了。
记录如下。
二、重点部分
1.DB2中,varchar必须写明长度限制,bigint与integer必须不写长度限制。(一个小坑)
2.mysql中,varchar(30)可以保存30个汉字;DB2中,varchar(90)才可以保存30个汉字。因此mysql迁移DB2时,对于有汉字的列,长度限制一定要记得*3。(一个大坑,本人亲测)
3.mysql与DB2字段对应关系样例(迁移时遇到的)
Mysql字段 | DB2字段 |
varchar(15) | varchar(45) |
longtext | CLOB(2G) |
bigint(20) | bigint |
int(11) | integer |
datetime | timestamp |
bit(1) | character(1) |
4.mysql建表语句改DB2时,bit(1)改为varchar(1) for bit data,当insert数据时就会报错,所以bit(1)改为character(1)。
5.DB2不能修改已有的列类型,只能新增或删除列;而mysql是可以的。
6.DB2建表语句与mysql的区别是,mysql对于列的注释、索引,都是写在create()语句的括号里面的;但是DB2中列的注释、索引,是要单独写到外面的。(下方有样例)
7.因此DB2中,增加列的注释、索引的语句,参考下方的样例即可,可以单独执行。
三、sql样例
- mysql建表语句样例
create table `course_info` (
`id` bigint(20) not null auto increment,
`course_id` varchar(15) character set utf8 collate utf8_general_ci NULL DEFAULT NULL,
`course_details` longtext character set utf8 collate utf8_general_ci NULL,
`course_duration` bigint(20) NULL DEFAULT NULL,
`play_times` int(11) NULL DEFAULT NULL comment '播放量',
`can_slide` bit(1) NULL DEFAULT NULL,
`up_date` datetime NULL DEFAULT NULL,
`can_share` varchar(2) character set utf8 collate utf8_general_ci NULL DEFAULT '0',
PRIMARY KEY (`id`),
INDEX `idx_id` (`course_code`) using btree,
INDEX `idx_slide_share` (`can_slide`,`can_share`) using btree
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=754
ROW_FORMAT=DYNAMIC
;
- DB2建表语句样例
create table course_info (
ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
COURSE_CODE VARCHAR(45),
COURSE_DETAILS CLOB(2G),
COURSE_DURATION BIGINT,
PLAY_TIMES INTEGER,
CAN_SLIDE CHARACTER(3),
UP_DATE TIMESTAMP,
CAN_SHARE VARCHAR(6),
PRIMARY KEY(ID)
);
COMMENT ON TABLE COURSE_INFO IS '课程视频表';
COMMENT ON COLUMN COURSE_INFO.play_times IS '播放次数';
create index idx_id on course_info(course_code);
create index idx_slide_share on course_info(can_slide, can_share);
●建表最重要的三点:
1.列
需要注意列类型、长度、初始值、是否允许为空、是否自增等。
2.注释
分为表注释和列注释。
3.索引。
mysql中可以选索引类型(Normal,Unique,Full Text)、索引方法(BTREE,HASH);DB2部分相似。
四、其它笔记
1.db2参数schema与database与user的区别
Oracle中,schema与user是同一个概念;
Mysql中,schema与database是同一个概念;
db2中,schema与database与user都不是同一个概念。
背景原因
●Oracle数据库是数据库本身管理用户的,即每一个要访问Oracle的用户都必须先在Oracle数据库里创建用户;而DB2并没有自己的用户帐号,DB2使用的是操作系统的帐号,DB2只需要对相应的操作系统账户进行授权,则该操作系统账户就可以访问DB2数据库。
●MySql中,下方sql:
select * from a.usertable;
其中,a是schema(纲要),也是database的名称;意思是查询a库的usertable表。
●DB2中,下方sql:
select * from a.usertable;
其中,a是schema(纲要),但不是database的名称,也不是用户;意思是查询某个库里的纲要为a里的usertable表;数据库连接url中配置的才是数据库名。
●DB2需要的参数样例:
数据库ip: 10.123.123.123
数据库名: dbname
用户名: user1
密码: user1
schema(纲要名): sname
表名: usertable
与mysql相比,多了schema;注意schema与database不是一个概念。