2011-12-27 52 views
2
create table supplier( 
. 
. 
. 
city varchar2(16) references city(city_name) 
); 

什麼是正確的查詢?如何使用ALTER TABLE在Oracle-SQL中刪除內聯外鍵?

alter table suppliers modify city varchar2(16); 
+1

歡迎堆棧溢出。您可以使用工具欄按鈕格式化源代碼。這次我爲你做了。 – 2011-12-27 09:19:36

+2

閱讀有關語法的Oracle文檔。您會驚訝於通過閱讀文檔您還學到了什麼;) – someuser2 2011-12-27 12:14:46

回答

9

你的問題是,你已經創建了一個外鍵不給一個名稱約束。這是不好的做法,因爲它使操作約束變得更加困難,因爲幾乎所有的Oracle DDL都需要對象名稱。

當我們沒有明確命名約束時,Oracle會生成一個默認約束。這些都非常相似,並且沒有辦法告訴約束實際上做了什麼。例如,如果您在SUPPLIER上有三個外鍵約束,您需要加入USER_CONS_COLUMNS視圖才能看到哪個約束實際上在CITY列上實施了一條規則。

所以,以供將來參考,

city varchar2(16) constraint city_fk references city(city_name) 

無論如何,現在你需要找到外鍵約束的默認的名稱,這樣就可以把它。我們假設你對CITY表格同樣寬鬆,所以首先我們需要找到它的主鍵(如果你真的知道名字,你可以跳過這個階段)。

select constraint_name 
from user_constraints 
where table_name = 'CITY' 
and constraint_type = 'P' 

接下來,饋那名進入該查詢:

select constraint_name 
from user_constraints 
where table_name = 'SUPPLIER' 
and constraint_type = 'R' 
and r_constraint_name = '&CITY_PK' 

最後,刪除約束:

alter table supplier drop constraint city_fk 
2

你想這樣做:

ALTER TABLE supplier 
DROP CONSTRAINT constraint_name 

如果你沒有給約束明確的名稱,甲骨文asigned一個給你,所以你必須先找到它。你可以列出所有,例如:表約束

SELECT * 
FROM user_constraints 
WHERE TABLE_NAME='SUPPLIER' 
+0

這聽起來正確...如果查詢返回沒有行呢? – 2011-12-27 09:33:54

+0

如果在SUPPLIER上有多個外鍵約束,那麼您的簡單查詢就不夠用了。 – APC 2011-12-27 09:35:39

+0

@popstack - 我在表名中使用了大寫字母,嘗試刪除where子句並添加'ORDER BY TABLE_NAME'以防萬一。 – 2011-12-27 10:02:26