2011-02-14 40 views
2

我想从SQL表中删除外键,但由于某种原因它不工作。为什么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” 是一个未定义的名称。

+2

请向我们展示PETS的表格创建语句,并发布错误,您还收到 – Jason 2011-02-14 01:11:03

回答

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'。