Выключить внешний ключ, не зная имя ограничения?

Я создал одну таблицу, используя следующую команду:

create table Table1(
    Id int Not Null 
        Foreign key 
        references Table2(Id)  
        on delete cascade 
        on update cascade,
    UserName nvarchar(150),
    TimeInSeconds int Not Null 

    primary key(Id,TimeInSeconds)
);

Но теперь я хочу сбросить внешний ключ. Поскольку я не имел данного имени ограничения, я не могу использовать:

Alter table <tablename>
drop foreign key <foreign key name>

Есть ли какой-нибудь способ? Помощь Pls.

Ответы

Ответ 1

Вы можете найти имя ограничения в INFORMATION_SCHEMA.TABLE_CONSTRAINTS

select CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Table1'

Ответ 2

Аналогичен Ed Ed, но вы можете использовать это, чтобы выбрать имя ключа, основанное на имени таблицы и столбца.

Таким образом вы можете запустить его в script или, возможно, в качестве подзапроса, чтобы удалить ограничение.

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME =  'post'
AND COLUMN_NAME =  'userID'

Ответ 3

Расширение ответов, так как я столкнулся с некоторыми ошибками. Кроме того, у меня было объявлено 2 внешних ключа, поэтому я добавил необязательный ключ, чтобы сохранить, если он равен нулю, он просто будет проигнорирован:

declare @name varchar(255),
     @table varchar(255) = 'mytable',
     @column varchar(255) = 'mykeycolumn',
     @validkey varchar(255) =  'mykeyIwanttokeep'

SELECT @name = CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @table
    AND COLUMN_NAME =  @column
    AND (CONSTRAINT_NAME != @validkey or @validkey is null)

declare @sql varchar(1023) = 'alter table ' + @table + ' drop ' + @name 

exec (@sql)

Ответ 4

Параметр SQL Server:

DECLARE @foreignkey varchar(100)
DECLARE @tablename varchar(100)
DECLARE @command nvarchar(1000)

DECLARE db_cursor CURSOR FOR
SELECT fk.name, t.name
FROM sys.foreign_keys fk
JOIN sys.tables t ON t.object_id = fk.parent_object_id
WHERE t.name IN (
    'table_1_name_here',
    'table_2_name_here'
)

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @command = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @foreignkey
    EXECUTE(@command)
    FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename
END
CLOSE db_cursor
DEALLOCATE db_cursor

SQL выбирает все ограничения для таблиц, которые вас интересуют, в курсор и бросает их один за другим. Все, что вам нужно знать, это имена таблиц, из которых вы хотите их удалить.

Ответ 5

Если вы просто посмотрите на таблицу в студии управления предприятием/студии управления, вы сможете увидеть список ключей и удалить их там.

Ответ 6

Неважно, это синтаксис Postgres.

~ Вы также можете удалить и повторно добавить первичный ключ в родительскую таблицу, используя cascade. Это удалит все внешние ключи, которые ссылаются на эту таблицу, без необходимости знать имена внешних ключей. ~

ALTER TABLE parent_table
DROP CONSTRAINT 'pk_id' CASCADE

-- add back pk
ALTER TABLE parent_table
ADD CONSTRAINT 'pk_id' PRIMARY KEY (id)

ВНИМАНИЕ: сначала вы хотите проверить все зависимости, а если есть другие таблицы, вам необходимо добавить их внешние ключи. Это позволяет вам правильно называть внешние ключи при добавлении их обратно. Этот подход также может быть нежизнеспособным в системе с высокими транзакциями из-за блокирующей транзакции.

Ответ 7

вы можете поставить:

показать создание таблицы tablename;

вы увидите, как была создана таблица... столбцы, типы... и т.д. и вы можете увидеть свое имя ограничения.