Как удалить встроенный внешний ключ в Oracle-SQL с помощью ALTER TABLE? - PullRequest
2 голосов
/ 27 декабря 2011
create table supplier(  
.  
.  
.  
city varchar2(16) references city(city_name)  
);  

Какой правильный запрос?

alter table suppliers modify city varchar2(16);  

Ответы [ 2 ]

9 голосов
/ 27 декабря 2011

Проблема в том, что вы создали внешний ключ без указания имени ограничения.Это плохая практика, потому что это усложняет манипулирование ограничением, поскольку почти весь 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 голосов
/ 27 декабря 2011

Вы хотите сделать это:

ALTER TABLE supplier
DROP CONSTRAINT constraint_name

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

SELECT *
FROM user_constraints
WHERE TABLE_NAME='SUPPLIER'
...