在Teradata中创建的幻影表

时间:2018-05-29 13:36:21

标签: sql teradata

我使用Teradata 16.20.05.01运行以下脚本:

create table t1(v int not null);
create table t2(w int null);
alter table t1 add constraint pk primary key (v);
alter table t2 add constraint t2_fk foreign key (w) references t1 (v);

添加外键后,我突然在我的架构中得到一个多余的表:

select TableName, RequestText
from "DBC".Tables
where DatabaseName = 'test'
and (TableName like 't1%' or TableName like 't2%')

输出:

TableName |RequestText                                                           |
----------|----------------------------------------------------------------------|
t1        |alter table t1 add constraint pk primary key (v)                      |
t2        |create table t2(w int null)                                           |
T2_0      |alter table t2 add constraint t2_fk foreign key (w) references t1 (v) |

重新创建该外键时,这尤其令人讨厌:

alter table t2 drop constraint t2_fk;
alter table t2 add constraint t2_fk foreign key (w) references t1 (v);

由于以下原因,这是不可能的。

  

SQL错误[5303] [HY000]:[Teradata数据库] [TeraJDBC 15.00.00.33] [错误5303] [SQLState HY000]错误表' TEST.t2_0'已经存在。

解决方法:

使用内联约束定义

时不会出现此问题
create table t1(v int not null, constraint pk primary key (v));
create table t2(w int null, constraint t2_fk foreign key (w) references t1 (v));

这是一个已知问题吗?有可靠的解决方法吗?

1 个答案:

答案 0 :(得分:4)

这是记录的行为,当您向现有表添加外键时,会创建一个错误表,并且所有违反约束的行都会被复制到其中。并且在ALTER之后它不会自动掉线。

解决方法很简单:不要使用标准外键,你几乎找不到使用它的网站。切换到批处理FK,即REFERENCES WITH CHECK OPTION,它在请求级别(不是逐行)上应用检查,或者应用于软件/虚拟FK REFERENCES WITH NO CHECK OPTION,它只是在不强制执行约束的情况下定义约束(你必须检查加载脚本中的PK / FK违规。