Ответ 1
Вы можете найти имя ограничения в INFORMATION_SCHEMA.TABLE_CONSTRAINTS
select CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Table1'
Я создал одну таблицу, используя следующую команду:
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.
Вы можете найти имя ограничения в INFORMATION_SCHEMA.TABLE_CONSTRAINTS
select CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Table1'
Аналогичен Ed Ed, но вы можете использовать это, чтобы выбрать имя ключа, основанное на имени таблицы и столбца.
Таким образом вы можете запустить его в script или, возможно, в качестве подзапроса, чтобы удалить ограничение.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'post'
AND COLUMN_NAME = 'userID'
Расширение ответов, так как я столкнулся с некоторыми ошибками. Кроме того, у меня было объявлено 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)
Параметр 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 выбирает все ограничения для таблиц, которые вас интересуют, в курсор и бросает их один за другим. Все, что вам нужно знать, это имена таблиц, из которых вы хотите их удалить.
Если вы просто посмотрите на таблицу в студии управления предприятием/студии управления, вы сможете увидеть список ключей и удалить их там.
Неважно, это синтаксис 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)
ВНИМАНИЕ: сначала вы хотите проверить все зависимости, а если есть другие таблицы, вам необходимо добавить их внешние ключи. Это позволяет вам правильно называть внешние ключи при добавлении их обратно. Этот подход также может быть нежизнеспособным в системе с высокими транзакциями из-за блокирующей транзакции.
вы можете поставить:
показать создание таблицы tablename;
вы увидите, как была создана таблица... столбцы, типы... и т.д. и вы можете увидеть свое имя ограничения.