create table supplier(
.
.
.
city varchar2(16) references city(city_name)
);
什麼是正確的查詢?如何使用ALTER TABLE在Oracle-SQL中刪除內聯外鍵?
alter table suppliers modify city varchar2(16);
create table supplier(
.
.
.
city varchar2(16) references city(city_name)
);
什麼是正確的查詢?如何使用ALTER TABLE在Oracle-SQL中刪除內聯外鍵?
alter table suppliers modify city varchar2(16);
你的問題是,你已經創建了一個外鍵不給一個名稱約束。這是不好的做法,因爲它使操作約束變得更加困難,因爲幾乎所有的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
你想這樣做:
ALTER TABLE supplier
DROP CONSTRAINT constraint_name
如果你沒有給約束明確的名稱,甲骨文asigned一個給你,所以你必須先找到它。你可以列出所有,例如:表約束
SELECT *
FROM user_constraints
WHERE TABLE_NAME='SUPPLIER'
這聽起來正確...如果查詢返回沒有行呢? – 2011-12-27 09:33:54
如果在SUPPLIER上有多個外鍵約束,那麼您的簡單查詢就不夠用了。 – APC 2011-12-27 09:35:39
@popstack - 我在表名中使用了大寫字母,嘗試刪除where子句並添加'ORDER BY TABLE_NAME'以防萬一。 – 2011-12-27 10:02:26
歡迎堆棧溢出。您可以使用工具欄按鈕格式化源代碼。這次我爲你做了。 – 2011-12-27 09:19:36
閱讀有關語法的Oracle文檔。您會驚訝於通過閱讀文檔您還學到了什麼;) – someuser2 2011-12-27 12:14:46