我们在 Oracle 数据库中的表上遇到了一种奇怪的情况,删除一列会导致更改另一列的默认值。这是场景。
我的表中包含一些示例数据:
select * from SAMPLE_TABLE ;
ID BUSINESS_KEY
---------------------------------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2
我添加列TYPE1带有检查约束(类型1_VAL1 or 类型1_VAL2) 和默认值类型1_VAL2 :
alter table SAMPLE_TABLE add TYPE1 varchar(10) default 'TYPE1_VAL2' not null check(TYPE1 in ('TYPE1_VAL1', 'TYPE1_VAL2'));
Table altered.
我看到默认值(类型1_VAL2) 正确填写:
select * from SAMPLE_TABLE ;
ID BUSINESS_KEY TYPE1
---------------------------------------- --------------- ----------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2 TYPE1_VAL2
我添加另一列 TYPE2 和另一个检查约束(类型2_VAL1 or 类型2_VAL2) 和默认值类型2_VAL2 :
alter table SAMPLE_TABLE add TYPE2 varchar(15) default 'TYPE2_VAL2' not null check(TYPE2 in ('TYPE2_VAL1', 'TYPE2_VAL2'));
Table altered.
再次看到默认值(类型2_VAL2) 是正确的 :
SYSTEM(SYSTEM) @ DB_USER > select * from SAMPLE_TABLE ;
ID BUSINESS_KEY TYPE1 TYPE2
---------------------------------------- --------------- ---------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1 TYPE1_VAL2 TYPE2_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2 TYPE1_VAL2 TYPE2_VAL2
现在是奇怪的部分。当我删除第一列时,它似乎将删除的列中的默认值应用到剩余的列上:
ALTER TABLE SAMPLE_TABLE DROP COLUMN TYPE1;
Table altered.
select * from SAMPLE_TABLE ;
ID BUSINESS_KEY TYPE2
---------------------------------------- --------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2 TYPE1_VAL2
那么在哪里之前TYPE2列包含类型2_VAL2,在掉落后突然包含类型1_VAL2。就好像已删除列的检查约束移动到了该列。
这种情况发生在我们的测试环境中,我们在 Linux 上运行 Oracle Database 11g 版本 11.2.0.4.0 - 64 位生产版。
在我们本地的 CentOS / Oracle XE 版本上,我们没有这个问题。
知道什么可能导致这种情况以及我们如何防止这种情况发生。这是我们设计的/错误/错误吗?