Oracle转为Mysql的数据结构差别
Oracle的表空间相关函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | TABLESPACE "SYSTEM" LOGGING NOCOMPRESS PCTFREE 10 INITRANS 1 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT ) PARALLEL 1 NOCACHE DISABLE ROW MOVEMENT |
oracle相关函数讲解
-
TABLESPACE "SYSTEM"
: 这一行表示你正在创建一个名为"SYSTEM"的表空间。在Oracle数据库中,"SYSTEM"是默认的系统表空间,通常用于存储数据库的对象(如表,视图,索引等)。 -
LOGGING
: 这一行表示表空间将启用 logging。这意味着在表空间中进行的所有更改都将被记录到重做日志中,从而可以用于恢复操作。 -
NOCOMPRESS
: 这一行表示表空间将不会被压缩。在Oracle中,你可以使用表压缩来减少磁盘空间的使用。 -
PCTFREE 10
: 这一行表示表空间中的每个数据块将保留10%的空间不使用。这是为了在数据块中插入新数据时,有足够的空间来扩展数据块。 -
INITRANS 1
: 这一行表示在创建对象时,每个数据块的初始事务计数为1。事务计数用于跟踪当前在数据块上执行的事务数量。 -
STORAGE ( ... )
: 这一部分是关于表空间的存储参数。这些参数包括:INITIAL 65536
: 初始化表空间的大小为65536字节。NEXT 1048576
: 在表空间中分配下一个连续的数据段时,其大小为1048576字节。MINEXTENTS 1
: 数据段的最小扩展数为1。MAXEXTENTS 2147483645
: 数据段的最大扩展数为2147483645。FREELISTS 1
: 数据段上的自由列表数为1。FREELIST GROUPS 1
: 数据段上的自由列表组数为1。BUFFER_POOL DEFAULT
: 数据段将使用默认的缓冲池。
-
PARALLEL 1
: 这一行表示表空间可以用于并行查询。这可以提高查询性能,特别是在多处理器系统中。 -
NOCACHE
: 这一行表示表空间的数据不会被缓存。这意味着每次访问数据块时,都需要从磁盘读取数据块。 -
DISABLE ROW MOVEMENT
: 这一行表示在表空间中禁止行的移动操作。行的移动是在执行某些操作(如更新)时,Oracle将行的数据从原来的位置移动到新的位置的过程。禁用行移动可以提高性能,但也可能导致更频繁的磁盘I/O操作。
MySQL对应表空间
MySQL数据库管理系统的表空间是自动管理的,它不需要像Oracle那样显式地创建表空间。MySQL使用数据文件来存储表数据,这些数据文件可以自动扩展以适应数据增长。
oracle 建表语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | CREATE TABLE "xxxxDBname" . "TP_PRODUCT" ( "ID" NUMBER(18,0) NOT NULL , "NAME" VARCHAR2(100 CHAR ) DEFAULT '' NOT NULL , "CODE" VARCHAR2(20 BYTE) NOT NULL , "TP_CATEGORY_ID" NUMBER(18,0) NOT NULL , "STATUS" NUMBER(4,0) DEFAULT 0 , "CREATE_BY" NUMBER(18,0) DEFAULT 0 , "UPDATE_BY" NUMBER(18,0) DEFAULT 0 , "CREATE_TIME" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP , "UPDATE_TIME" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP , "IS_PROCESSING" NUMBER(5,0) DEFAULT 0 , "UNIT" VARCHAR2(20 CHAR ) DEFAULT '' , "EN_NAME" VARCHAR2(100 BYTE) DEFAULT '' , "EN_UNIT" VARCHAR2(20 BYTE) DEFAULT '' ) TABLESPACE "SYSTEM" LOGGING NOCOMPRESS PCTFREE 10 INITRANS 1 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT ) PARALLEL 1 NOCACHE DISABLE ROW MOVEMENT ; |
我需要把它转为mysql的
DROP TABLE `xxxxDBname`.`tp_product`;
CREATE TABLE `xxxxDBname`.`tp_product` (
`id` bigint(20) NOT NULL,
`tenant_id` varchar(200) DEFAULT '' NOT NULL,
`name` varchar(100) DEFAULT '' NOT NULL,
`code` varchar(20) NOT NULL,
`tp_category_id` bigint(20) NOT NULL,
`status` int(4) DEFAULT 0,
`create_by` bigint(20) DEFAULT 0,
`update_by` bigint(20) DEFAULT 0,
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP,
`is_processing` int(5) DEFAULT 0,
`unit` varchar(20) DEFAULT '',
`en_name` varchar(100) DEFAULT '',
`en_unit` varchar(20) DEFAULT '',
PRIMARY KEY (`id`, `tenant_id`) -- 将id和tenant_id设置为复合主键
) ENGINE=InnoDB;
在MySQL中,您无需指定表空间、日志、压缩和存储参数,因为这些功能是由MySQL自动管理的。因此,我已经删除了与这些功能相关的语句。
此外,MySQL使用不同的数据类型和限制。我已经根据MySQL的规范对数据类型和限制进行了调整。请注意,MySQL没有 NUMBER
数据类型,而是使用 BIGINT
来存储较大的整数。同样地,MySQL没有 VARCHAR2
和 VARCHAR2
数据类型,而是使用 VARCHAR
。对于字符串类型的长度,MySQL使用的是字符数而不是字节数。因此,我相应地调整了数据类型的定义。
如果您需要为表指定存储参数,可以在MySQL中使用 CREATE TABLE ... ENGINE=InnoDB [STORAGE参数]
的语法。但是,请注意,MySQL的存储参数与Oracle有所不同。因此,我已经删除了与存储参数相关的语句。
oracle添加语句转为mysql添加语句
oracle添加语句
1 2 3 | INSERT INTO "xxx数据库" . "xxx表名" VALUES ( '292668615462760448' , 'P40' , 'SJ001' , '292667756276363264' , '0' , '100000000000000027' , '100000000000000004' , TO_TIMESTAMP( '2020-09-03 14:40:35.446000' , 'SYYYY-MM-DD HH24:MI:SS:FF6' ), TO_TIMESTAMP( '2020-09-20 10:04:49.968000' , 'SYYYY-MM-DD HH24:MI:SS:FF6' ), '0' , '件' , 'P40' , NULL ); INSERT INTO "xxx数据库" . "xx表名" VALUES ( '299540169802924032' , 'M5(8.5吋)单晶方棒' , 'SJ1' , '1' , '1' , '100000000000000028' , '100000000000000028' , TO_TIMESTAMP( '2020-09-22 13:45:41.670000' , 'SYYYY-MM-DD HH24:MI:SS:FF6' ), TO_TIMESTAMP( '2020-09-29 17:33:58.152000' , 'SYYYY-MM-DD HH24:MI:SS:FF6' ), '0' , 'MM' , NULL , NULL ); INSERT INTO "xxx数据库" . "xx表名" VALUES ( '299540352380977152' , 'FR(8.8吋)单晶方棒' , 'SJ2' , '1' , '1' , '100000000000000028' , '100000000000000028' , TO_TIMESTAMP( '2020-09-22 13:46:25.198000' , 'SYYYY-MM-DD HH24:MI:SS:FF6' ), TO_TIMESTAMP( '2020-09-29 17:34:33.022000' , 'SYYYY-MM-DD HH24:MI:SS:FF6' ), '0' , 'MM' , NULL , NULL ); |
mysql添加语句
INSERT INTO `xxx`.`xxx表名称` VALUES ('292668615462760448','ems_default', 'P40', 'SJ001', '292667756276363264', '0', '100000000000000027', '100000000000000004', STR_TO_DATE('2020-09-03 14:40:35.446', '%Y-%m-%d %H:%i:%s.%f'), STR_TO_DATE('2020-09-20 10:04:49.968', '%Y-%m-%d %H:%i:%s.%f'), '0', '件', 'P40', NULL);
INSERT INTO `xxx`.`xxx表名称` VALUES ('299540169802924032','ems_default1', 'M5(8.5吋)单晶方棒', 'SJ1', '1', '1', '100000000000000028', '100000000000000028', STR_TO_DATE('2020-09-22 13:45:41.67', '%Y-%m-%d %H:%i:%s.%f'), STR_TO_DATE('2020-09-29 17:33:58.152', '%Y-%m-%d %H:%i:%s.%f'), '0', 'MM', NULL, NULL);
增加注释的方式不同点:
1 2 3 4 | COMMENT ON COLUMN "xxx" . "TP_PRODUCT" . "IS_PROCESSING" IS '是否加工品' ; --oracle语句 ALTER TABLE `xxxx`.`tp_product` CHANGE COLUMN `is_processing` `is_processing` INT COMMENT '是否加工品' ; -------mysql语句<br><br> |
这里,我们使用CHANGE COLUMN子句更改了is_processing
列的名称,并添加了注释'是否加工品'。
二者索引的转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 在Oracle中,你创建了一个唯一索引并指定了各种参数,包括索引名称、表名称、列名称、排序方式、日志记录、表空间、可见性、PCTFREE、INITRANS、存储参数等。然而,在MySQL中,索引的创建语法与Oracle有所不同。<br> CREATE UNIQUE INDEX "xxx数据库名称" . "PRODUCT_CODE" ON "数据库名称" . "表名称" ( "CODE" ASC ) LOGGING TABLESPACE "SYSTEM" VISIBLE PCTFREE 10 INITRANS 2 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT );<br><br><br><strong>转为mysql的</strong> |
CREATE UNIQUE INDEX `product_code` ON `tp_product` (code ASC);
--
CREATE TABLE tp_product ( -- 其他列定义... code INT, -- 其他列定义... INDEX product_code (code ASC), -- 其他索引定义... UNIQUE (code ASC) WITH (invisible = true) );
这是一个MySQL语句,用于在名为"tp_product"的表上创建一个唯一索引,索引名为"product_code"。下面是各部分的含义:
CREATE UNIQUE INDEX
:这是创建唯一索引的命令。product_code
:这是索引的名称。ON tp_product (code ASC)
:这指定了要在哪个表(这里是"tp_product")上创建索引,以及要索引哪个列(这里是"code")。ASC
表示按照升序排序。INVISIBLE
:这个选项将索引设置为不可见,这意味着在执行查询时,优化器通常会忽略这个索引。这可以用于优化目的,比如当索引的选择性不高时。LOGGING
:这个选项启用索引操作的日志记录。TABLESPACE = 'system'
:这指定了索引的表空间,这里是'system'。COMMENT=''
:这是对索引的注释,这里没有给出注释。KEY_BLOCK_SIZE = 0
:这是指定索引的块大小,通常用于调整InnoDB存储引擎的IBUF(Insert Buffer)大小。这里设置为0,表示使用默认值。
- 在MySQL中,唯一索引的创建使用
CREATE UNIQUE INDEX
语句,而不是CREATE INDEX
。 - MySQL不支持
VISIBLE
选项,因此我将其设置为INVISIBLE
。你可以根据需要将其更改为可见或不可见。 - MySQL不支持
PCTFREE
和INITRANS
选项,因此我省略了这些参数。 - 在MySQL中,表空间是通过在
CREATE TABLE
语句中指定TABLESPACE
来实现的,而不是在索引创建语句中。我在这里将其设置为'system'。 - MySQL不支持
LOGGING
选项,因此我省略了该参数。 - 在MySQL中,索引的存储参数是通过在
CREATE TABLE
语句中指定KEY_BLOCK_SIZE
来实现的,而不是在索引创建语句中。我在这里将其设置为0。 - 在Oracle中,索引名称是在
CREATE INDEX
语句中指定的,而在MySQL中,索引名称是在CREATE UNIQUE INDEX
语句中指定的。我在这里将其命名为"product_code"。 - 在Oracle中,可以使用
VISIBLE
选项来指定可见性,而在MySQL中,可见性是通过设置其他参数(如ENGINE=InnoDB
)来控制的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!