Firebird: изменить анонимный внешний ключ

Мне нужно изменить существующий внешний ключ с «при ограничении удаления» на «при каскадном удалении». К сожалению, эта ошибка проскользнула через Q/A.

В моей базе данных у меня есть несколько отношений внешнего ключа, которые были автоматически названы (INTEG_1, INTEG_2, ...). Имя ограничения, которое я должен исправить, отличается в новой установке от версии 2 и даже от версии 2, которая ранее была обновлена ​​с версии 1.

Поскольку таблица ссылок имеет только один внешний ключ, этот оператор дает мне имя ограничения:

SELECT RDB$CONSTRAINT_NAME
FROM RDB$RELATION_CONSTRAINTS
where RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' 
  and RDB$RELATION_NAME = 'MY_TABLE_NAME'

затем я могу сбросить, а затем воссоздать внешний ключ (на этот раз с «настоящим» именем)

alter table MY_TABLE_NAME 
drop constraint <result from above>;

alter table MY_TABLE_NAME
add constraint fk_my_table_name_purpose foreign key (other_id) 
      references other_table(id) on delete cascade;

Однако я стараюсь не работать напрямую с системными таблицами, и мне хотелось бы знать, есть ли лучший/более элегантный способ изменить мой внешний ключ.


person Chris    schedule 11.11.2014    source источник
comment
старайтесь избегать работы напрямую с системными таблицами - почему? Это официальный API для получения подобной информации (поскольку в Firebird нет стандартного INFORMATION_SCHEMA)   -  person a_horse_with_no_name    schedule 11.11.2014
comment
Я рассматривал системные таблицы как нечто внутреннее в БД, с которым вы МОЖЕТЕ взаимодействовать, но не должны (если это возможно). Но если мое решение уже официальное... отлично :-)   -  person Chris    schedule 11.11.2014
comment
Совет не работать с системными таблицами напрямую касается изменения системных таблиц. В Firebird технически возможно выполнять некоторые формы DDL путем вставки, обновления или удаления элементов из системных таблиц. У этого есть свои проблемы, поэтому Firebird 3 сделает это невозможным (за некоторыми исключениями).   -  person Mark Rotteveel    schedule 11.11.2014


Ответы (1)


Нет лучшего способа, системные таблицы — единственный способ выяснить имя ограничения.

person Martijn Tonies    schedule 11.11.2014
comment
и это вполне легальный способ получить информацию о структуре базы данных. - person Andrej Kirejeŭ; 11.11.2014