数据库遇到的坑爹问题
最近做系统升级,对旧数据库数据进行新旧替换和迁移数据操作,发现的一些坑爹问题,做出些总结
数据库数据迁移,涉及mysql、Oracle数据库;
问题如下:
1,Oracle中不识别’’;空串必须在引号中间加空格’ ‘;另外不等于空串可写成:!=’ ’ 或者 <>‘ ’;
2,Oracle中select复杂的查询语句带的, 必须加表的别名,否则会报错;很坑的,明明只有一张表,只是对查询展示字段进行拓展新增两个字段就会报错;
例:
select * ,‘0’ newStatus from userTable; 错;
select t., ‘0’ newStatus from userTable t ; 对;
3,Oracle中查询排序语句 order by 后面不能连续写两个字段【不知道是我写的不对还是不知道怎么写,但是在mysql中却完全OK,无语了!】;
4,Oracle中建表语句加索引,不同表的索引字段也不能相同,否则会报冲突;常出现在创建备份表,或临时备份表中;
5,备份数据drop掉表之前,最好写一份备份表语句(表名随时间动态拼接),以免造成数据丢失;
begin
execute immediate ‘create table CITY_’||to_char(sysdate, ‘yyyymmddHHmmss’)||’ as select * from wb_user’;
end;
6,mysql中再drop或者清除表数据之前,最好先备份一份表数据,创建一个随时间动态生成表名的建表语句;
范例:SET @pddl = concat(‘select * from user’, @var);
PREPARE stmt FROM @pddl;/定义预处理语句/
EXECUTE stmt;/执行预处理语句/
DEALLOCATE PREPARE stmt;/释放预处理语句/
实例:
– 生成表名
set @sql_get_name = concat(“CITY_”, date_format(NOW(),’%y%m%d%H%i%s’));
– 建表
set @sql_create_table = concat(
'CREATE TABLE ',@sql_get_name,
“(
CITY_ID
bigint(30) NOT NULL COMMENT ‘城市ID’,
CITY_NAME
varchar(30) NOT NULL COMMENT ‘城市名称’,
PROVINCE_ID
varchar(8) NOT NULL COMMENT ‘省ID’,
CITY_SHORT_NAME
varchar(20) DEFAULT NULL COMMENT ‘简称’,
ORDER_ID
bigint(10) DEFAULT NULL COMMENT ‘排序(从1开始的正整数,NULL表示不排序,各level互不影响)’,
PRIMARY KEY (CITY_ID
)
) ENGINE=InnoDB DEFAULT CHARSET=UTF-8 COMMENT=‘城市表’”);
PREPARE sql_create_table FROM @sql_create_table;
EXECUTE sql_create_table;
– 插入数据
set @sql_insert_data = concat(
“INSERT INTO “,@sql_get_name,”(SELECT * FROM CITY)”);
PREPARE sql_insert_data FROM @sql_insert_data;
EXECUTE sql_insert_data;
DEALLOCATE PREPARE sql_create_table;/释放预处理语句/
DEALLOCATE PREPARE sql_insert_data;/释放预处理语句/
或者写成函数调用:
create procedure TempTableData(
in tableName VARCHAR(1000),
in tableBuild VARCHAR(300000),
in tableData VARCHAR(1000)
)
begin
set @sql_get_name = concat(tableName, date_format(NOW(),’%y%m%d%H%i%s’));
set @sql_create_table = concat(
'CREATE TABLE ',@sql_get_name,tableBuild);
PREPARE sql_create_table FROM @sql_create_table;
EXECUTE sql_create_table;
– DEALLOCATE PREPARE sql_create_table;/释放预处理语句/
set @sql_insert_data = concat(
"INSERT INTO ",@sql_get_name,tableData);
PREPARE sql_insert_data FROM @sql_insert_data;
EXECUTE sql_insert_data;
– DEALLOCATE PREPARE sql_insert_data;/释放预处理语句/
end;
CALL TempTableData(“CITY_”,"(
CITY_ID
bigint(30) NOT NULL COMMENT ‘城市ID’,
CITY_NAME
varchar(30) NOT NULL COMMENT ‘城市名称’,
PROVINCE_ID
varchar(8) NOT NULL COMMENT ‘省ID’,
CITY_SHORT_NAME
varchar(20) DEFAULT NULL COMMENT ‘简称’,
ORDER_ID
bigint(10) DEFAULT NULL COMMENT ‘排序(从1开始的正整数,NULL表示不排序,各level互不影响)’,
PRIMARY KEY (CITY_ID
)
) ENGINE=InnoDB DEFAULT CHARSET=UTF-8 COMMENT=‘城市表’","(SELECT * FROM CITY)");
!!!这里的函数TempTableData(v1,v2,v3)不能重复调用,只能重写一个重写调用,包括begin/end语句;
7,oracle中引用脚本语句,中出现了begin和end操作,要在end;后面转行加上\ 反斜杠进行提交操作;’
8,orcale中进行数据回滚操作时,会出现部分表无法正常被drop掉。可以先对要执行drop操作的表进行delete或者truncate操作清掉数据,然后进行commit操作,再进行drop操作即可正常;’
以上仅是个人总结,仅供参考!具体以实际操作验证为准!!