通过plsql将库A中的表X导出pde,然后倒入到另一个库B中,报错如下:
然后去看A库中的X表,发现有个checks里有东西。
我看着像是一个约束,用来保证ID不能为空。这个设置和keys即主键不是一个道理吗?然后我去看,果然没有给这个表设置主键。。
原来设计者是想通过checks来约束id不能为空,来替代Keys这种方式。至于为什么不用key,而是用checks,我就不清楚了。感觉得不偿失,很不明智,也很没有必要,一般没有这么干的。
---
那么oracle的plsql,checks是什么?干什么用的?是不是我猜想的那样呢?答案是:是的。
http://www.linuxidc.com/Linux/2014-11/109303.htm
亲测一下,还是按照上文的那个约束,id不能为空的约束:
首先插入一条id不为空的正常数据,正常写入一条记录到数据库。
然后插入一条id为空的数据,报错如下。
===回到该表通过plsql再次导入报错的问题,为什么?
我猜测可能是因为命名的checks的名字很诡异(其中可以看出有特殊字符和等号,如$==),不符合要求所以导入不成功。
所以我要将这个名字进行重命名。但是我发现直接通过plsql在界面上重命名,会报错,那么我只能先删除当前的,然后新增一个。
但是发现删也不能在界面上操作:
那我只能通过sql代码删除了试试了:
删除语句:
操作一把:
但是也还是不行。
我只能用终极策略了,将表X导出成sql脚本,然后:
①将sql的代码中,找到建表语句的创建checks的部分代码,然后将名称改为规范的。
②将该表删掉X。
③执行修改后的sql脚本(其中sql中也是有历史数据的,执行sql脚本一并导过来了)。
测试:
上面是建表语句,下面是历史数据。
然后导入修改后的脚本,成功。
然后再将表从库A导出成pde,然后倒入到库B,成功,没有任何报错,是done。
那我就纳闷了,这个不规范的名字,他是怎么成功写入到数据库中的?
不得而知,但是我偶然的机会发现,将之前删掉的表,之前的checks的名称就变了。。。就变成那种特殊的字符组成的东西,如果通过plsql的界面进行恢复,那checks的名称就当然变成那种特殊的字符组成的东西,我猜很有可能就是这个原因导致的。
然后如果恢复回去