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

Каков правильный запрос?Как удалить встроенный внешний ключ в Oracle-SQL с помощью ALTER TABLE?

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

Добро пожаловать на переполнение стека. Вы можете форматировать исходный код с помощью кнопки панели инструментов {{} '. На этот раз я сделал это для вас. –

+2

читайте документацию Oracle по синтаксису. Вы будете удивлены, что еще вы узнаете, прочитав документацию;) – someuser2

ответ

9

Проблема у вас есть то, что вы создали внешний ключ, не давая имя ограничения. Это плохая практика, потому что это затрудняет управление ограничением, так как почти все Oracle DDL требует имя объекта.

Когда мы не укажем явно ограничения, которые Oracle генерирует по умолчанию. Все они ужасно похожи, и нет способа сказать, что на самом деле делает ограничение. Например, если у вас было три ограничения внешнего ключа для ПОСТАВЩИКА, вам нужно будет присоединиться к представлению 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 

Если вы не дали ограничение на явное имя, Oracle asigned один для вас, так что вы должны найти его первым. Вы можете просмотреть список всех ограничений таблицы с, например .:

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

Звучит правильно ... Что делать, если запрос не возвращает строк ??? –

+0

Если на ПОСТАВЩИКЕ имеется более одного ограничения внешнего ключа, вашего простого запроса будет недостаточно. – APC

+0

@popstack - я принял заглавную букву в имени таблицы, попробуйте удалить предложение where и добавить «ORDER BY TABLE_NAME» на всякий случай. –

 Смежные вопросы

  • Нет связанных вопросов^_^