Призрачный стол создается в Teradata - PullRequest
0 голосов
/ 29 мая 2018

Я использую 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 голосов
/ 29 мая 2018

Это документированное поведение, когда вы добавляете внешний ключ в существующую таблицу, создается таблица ошибок, и в нее копируются все строки, нарушающие ограничение.И он не удаляется автоматически после ALTER.

Обходной путь прост: не используйте стандартные внешние ключи, вы вряд ли найдете сайт, использующий его.Переключитесь на пакетные FK, т.е. REFERENCES WITH CHECK OPTION, который применяет проверку на уровне запроса (не строка за строкой), или на Soft / Dummy FK, REFERENCES WITH NO CHECK OPTION, который просто определил ограничение, не применяя его (необходимо проверитьВ любом случае нарушения PK / FK в ваших скриптах загрузки).

...