Можем ли мы использовать запрос выбора в команде alter table в базе данных db2 - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть ограничение внешнего ключа для моей таблицы, созданное с помощью следующей команды в db2

ALTER TABLE "ADDRESS" ADD FOREIGN KEY("CITY_ID") REFERENCES CITY("ID");

Теперь я пытаюсь снять ограничение. Поскольку при создании не было задано имя ограничения, команда alter для удаления внешнего ключа не работает.

Можно ли использовать команду выбора внутри команды alter table, чтобы я мог запросить таблицу SYSCAT.TABCONST, чтобы получить идентификатор ограничения?

Что-то вроде

ALTER TABLE ADDRESS DROP FOREIGN KEY 
  (SELECT CONSTNAME FROM SYSCAT.TABCONST where tabname='ADDRESS' and TYPE='F')

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018
--#SET TERMINATOR @
BEGIN
  EXECUTE IMMEDIATE (SELECT 'ALTER TABLE '||TABSCHEMA||'.'||TABNAME||' DROP CONSTRAINT '||CONSTNAME FROM SYSCAT.REFERENCES WHERE TABSCHEMA=USER AND TABNAME='ADDRESS' AND REFTABSCHEMA=USER AND REFTABNAME='CITY');
END@

Обратите внимание, что может быть несколько адресов ADDRESS -> CITY. Но это будет работать, если между этими таблицами будет только один такой внешний ключ. Здесь мы предполагаем, что обе таблицы находятся в схеме текущего пользователя.

0 голосов
/ 02 ноября 2018

Вы можете использовать составной SQL для этого. Вот пример:

--#SET TERMINATOR @
begin
    declare v_fkname varchar(128) default '';
    declare v_sql varchar(1024);
    declare v_not_found integer default 0;
    declare not_found condition for sqlstate '02000';
    declare continue handler for not_found set v_not_found=1 ;
    set v_fkname = (select constname from syscat.tabconst where tabname='ACTORS' and tabschema='USER1' and type='F');
    if v_not_found = 0
    then
        set v_sql='ALTER TABLE actors DROP FOREIGN KEY '||v_fkname ;
        execute immediate(v_sql);
    end if;
end@

Помните, что вам также необходимо проверить после этого, что ни один объект не станет недействительным в результате этого изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...