2011-02-14 121 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'。