Почему SQL не позволяет мне удалить этот внешний ключ? - PullRequest
2 голосов
/ 14 февраля 2011

Я пытаюсь удалить внешний ключ из таблицы SQL, но по какой-то причине он не работает.

ALTER TABLE PETS
DROP FOREIGN KEY OWNER_NAME

Но вышесказанное не работает - я не понимаю. Синтаксис не слишком сложен, и у PETS есть внешний ключ OWNER_NAME для другой таблицы. Что дает?

Таблица домашних животных:

CREATE TABLE PETS
(
  NAME VARCHAR(10) NOT NULL,
  BIRTH_DATE DATE NOT NULL,
  OWNER_NAME VARCHAR(10) NOT NULL,
  PRIMARY KEY (NAME),
  FOREIGN KEY (OWNER_NAME) REFERENCES OWNER ON DELETE CASCADE
);

ОШИБКА ПОЛУЧЕНА: «OWNER_NAME» - это неопределенное имя.

1 Ответ

3 голосов
/ 14 февраля 2011

Синтаксис для удаления внешнего ключа:

   ALTER TABLE table
      DROP FOREIGN KEY fk_name

В вашем примере (который показывает, как создается ограничение внешнего ключа, OWNER_NAME - это , а не имя внешнего ключа - это имя столбца в используемой таблице PETS). для ссылки на таблицу ВЛАДЕЛЕЦ.

Поскольку вы не указываете конкретное имя для ограничения в операторе CREATE TABLE, оно будет иметь сгенерированное системой имя, которое будет выглядеть примерно как SQL110213181225320.

Вы можете найти имя ограничения, посмотрев на SYSCAT.REFERENCES:

   SELECT constname, fk_colnames
   FROM   syscat.references
   WHERE  tabschema = 'YOURSCHEMA'
     AND  tabname = 'PETS'

Затем вы можете удалить свой внешний ключ, используя соответствующее значение CONSTNAME из этого запроса:

ALTER TABLE домашние животные ОТКЛЮЧИТЬ ИНОСТРАННЫЙ КЛЮЧ SQL110213181225320;

К вашему сведению, если вы хотите иметь более нормальное имя для ограничения внешнего ключа, вы можете определить его в операторе CREATE TABLE:

CREATE TABLE PETS
(
  NAME VARCHAR(10) NOT NULL,
  BIRTH_DATE DATE NOT NULL,
  OWNER_NAME VARCHAR(10) NOT NULL,
  PRIMARY KEY (NAME),
  CONSTRAINT FK_OWNER 
     FOREIGN KEY (OWNER_NAME) 
     REFERENCES OWNER 
     ON DELETE CASCADE
);

Если вы сделаете это, то увидите, что запрос к SYSCAT.REFERENCES вернет 'FK_OWNER'.

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