代码之家  ›  专栏  ›  技术社区  ›  Lukas Eder

在Teradata中创建的幻影表

  •  2
  • Lukas Eder  · 技术社区  · 6 年前

    我正在使用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 database][terajdbc 15.00.00.33][error 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 回复  |  直到 6 年前
        1
  •  4
  •   dnoeth    6 年前

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

    解决方法很简单:不要使用标准的外键,很难找到任何使用它的站点。切换到批处理FK,即 REFERENCES WITH CHECK OPTION ,它对请求级别(不是逐行)或软/虚拟FK应用检查, REFERENCES WITH NO CHECK OPTION ,这只是定义了约束而不强制执行它(无论如何,您必须检查加载脚本中是否存在PK/FK冲突)。