Sql 正在Teradata中创建幻象表

Sql 正在Teradata中创建幻象表,sql,teradata,Sql,Teradata,我正在使用Teradata 16.20.05.01运行以下脚本: 创建表t1(v int不为空); 创建表t2(w int null); alter table t1添加约束pk主键(v); 更改表t2添加约束t2_fk外键(w)参考t1(v); 添加外键后,我的模式中突然出现一个多余的表: 选择TableName,RequestText 来自“DBC”。表 其中DatabaseName='test' 和(表名如“t1%”或表名如“t2%”) 输出: TableName | RequestT

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

创建表t1(v int不为空);
创建表t2(w int null);
alter table t1添加约束pk主键(v);
更改表t2添加约束t2_fk外键(w)参考t1(v);
添加外键后,我的模式中突然出现一个多余的表:

选择TableName,RequestText
来自“DBC”。表
其中DatabaseName='test'
和(表名如“t1%”或表名如“t2%”)
输出:

TableName | RequestText|
----------|----------------------------------------------------------------------|
t1 | alter table t1 add constraint pk主键(v)|
t2 |创建表t2(w int null)|
T2_0|更改表T2添加约束T2_fk外键(w)引用t1(v)|
当重新创建外键时,这尤其令人讨厌:

alter table t2 drop constraint t2_fk;
更改表t2添加约束t2_fk外键(w)参考t1(v);
这是不可能的,因为:

SQL错误[5303][HY000]:[Teradata数据库][TeraJDBC 15.00.00.33][Error 5303][SQLState HY000]错误表“TEST.t2_0”已存在

解决方法: 使用内联约束定义时不会出现此问题

创建表t1(v int不为null,约束主键(v));
创建表t2(w int null,约束t2_fk外键(w)引用t1(v));

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

这是一种记录在案的行为,当您向现有表添加外键时,会创建一个错误表,所有违反约束的行都会复制到该表中。而且它不会在更改后自动删除


解决方法很简单:不要使用标准外键,你很难找到任何网站使用它。切换到批处理FKs,即带有检查选项的
引用
,该选项将检查应用于请求级别(而不是逐行),或切换到软/虚拟FK,
引用,不带检查选项
,该选项仅定义约束而不强制执行约束(无论如何,必须检查加载脚本中是否存在PK/FK冲突).

我猜如果您添加不带检查选项的
就不应该有额外的表:
更改表t2添加约束t2\u fk外键(w)引用,不带检查选项t1(v)@lad2025:你说得对,谢谢