为什么不会让SQL删除这个外键?

时间:2011-02-14 01:08:41

标签: sql foreign-keys db2

我正在尝试从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 个答案:

答案 0 :(得分:3)

删除外键的语法是:

   ALTER TABLE table
      DROP FOREIGN KEY fk_name

在您的示例中(显示如何创建外键约束),OWNER_NAME 外键的名称 - 这是PETS表中列的名称用于引用OWNER表。

因为您没有在CREATE TABLE语句中为约束指定特定名称,所以它将具有系统生成的名称,类似于SQL110213181225320。

您可以通过查看SYSCAT.REFERENCES:

找到约束的名称
   SELECT constname, fk_colnames
   FROM   syscat.references
   WHERE  tabschema = 'YOURSCHEMA'
     AND  tabname = 'PETS'

然后,您可以使用此查询中相应的CONSTNAME值删除外键:

ALTER TABLE宠物       DROP FOREIGN KEY 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'。