ORACLE数据库设计之LONG类型踩坑

一、问题描述

1.之前一直使用Mysql数据库,对oracle不算太熟悉,由于接第三方系统,他们的一个标识是LONG类型的自增字段,然后在设计数据库表结构的时候,发现oracle也有这个LONG类型,也没有做事前评估,直接创建啦。下面是建表语句的示例:

CREATE TABLE "TZTEST_OWN"."TEST_LONG_TABLE" (
  "ID" VARCHAR2(20 BYTE) NOT NULL ,
  "TEST_DATA" VARCHAR2(20 BYTE) ,
  "TEST_LONG" LONG 
)
TABLESPACE "USERS"
LOGGING
NOCOMPRESS
PCTFREE 10
INITRANS 1
STORAGE (
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1
  MAXEXTENTS 2147483645
  BUFFER_POOL DEFAULT
)
PARALLEL 1
NOCACHE
DISABLE ROW MOVEMENT
;

-- ----------------------------
-- Primary Key structure for table TEST_LONG_TABLE
-- ----------------------------
ALTER TABLE "TZTEST_OWN"."TEST_LONG_TABLE" ADD CONSTRAINT "SYS_C0011392" PRIMARY KEY ("ID");

2.插入数据

INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('1', 'AA', '222');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('2', 'BB', '333');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('3', 'CC', '444');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('4', 'DD', '555');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('5', 'EE', '111');

3.更新插入没有问题,但是在做LONG类型的字段查询时出现啦问题;

SELECT * FROM TEST_LONG_TABLE WHERE TEST_LONG = 111L
SELECT * FROM TEST_LONG_TABLE WHERE LONG_to_char(TEST_LONG) = '111'

问题:
SELECT * FROM TEST_LONG_TABLE WHERE TEST_LONG = 111L
> ORA-00933: SQL command not properly ended
  
> 时间: 0.03s

怎么转换都不能使用,顿时慌得一笔。然后就请教各路大神,各种百度,最后通过ORACEL的官方文档找到了答案。百度都是只是不建议使用LONG类型,都是各种转换的例子,如果想明白为什么请参考官方解释:https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#sthref103

二、问题解决方案

无缝衔接的话建议参考:https://www.2cto.com/database/201512/455365.html

由于我们数据量太大而且数据同步需要时长太久,我们采取的是凌晨停服,新增一个字段,然后把LONG类型的那个字段的值同步到另外一个字段里面(使用的是VARCHAR2),最后删除原来字段,更新新建字段名称为原字段名。一千五百万数据整个操作不超过十分钟,最后代码类型同步之后安稳上线。

-- 测试数据库15206240 插入新字段 0.3s
alter table TEST_LONG_TABLE add (TEST_LONGS varchar2(50) default '0' not null);


--删除字段 
ALTER TABLE TEST_LONG_TABLE DROP COLUMN TEST_LONG;
--alter table TEST_LONG_TABLE drop column TEST_LONG
--> OK
--> 时间: 210.692s


--更换字段名
ALTER TABLE TEST_LONG_TABLE RENAME COLUMN TEST_LONGS TO TEST_LONG;
--ALTER TABLE TEST_LONG_TABLE RENAME COLUMN TEST_LONGS TO TEST_LONG
--> OK
--> 时间: 0.237s

--创建索引
Create index index_TEST_LONG on TEST_LONG_TABLE ( TEST_LONG )
--Create index index_TEST_LONG on TEST_LONG_TABLE ( TEST_LONG )
--> OK
--> 时间: 28.326s

如有披露或问题欢迎留言或者入群探讨

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值