Подтвердить что ты не робот

Как удалить ограничение внешнего ключа в sql-сервере?

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

Я новичок в базах данных, поэтому, пожалуйста, скажите мне правильный SQL-запрос, чтобы удалить или удалить значение внешнего ключа.

4b9b3361

Ответ 2

Неправильно это сделать, ссылаясь на ссылочную целостность, потому что, как только его сломать, нелегко включить его снова, не пройдя через записи и удалить те, которые нарушают ограничения.

В любом случае синтаксис выглядит следующим образом:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

См. MSDN:

Ответ 3

ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

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

Ответ 4

Чтобы удалить все ограничения из БД:

SELECT 'ALTER TABLE ' + Table_Name  +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE

Ответ 5

В зависимости от DB вы используете там синтаксис или другой.

Если вы используете Oracle, вы должны указать то, что вам сказали другие пользователи:

ALTER TABLE table_name DROP CONSTRAINT fk_name;

Но если вы используете MySQL, тогда это даст вам синтаксическую ошибку, вместо этого вы можете ввести:

ALTER TABLE table_name DROP INDEX fk_name;

Ответ 6

ALTER TABLE table
DROP FOREIGN KEY fk_key

EDIT: не заметил, что вы использовали sql-сервер, мой плохой

ALTER TABLE table
DROP CONSTRAINT fk_key

Ответ 7

Удалите все внешние ключи таблицы:

USE [Database_Name]
DECLARE @FOREIGN_KEY_NAME VARCHAR(100)

DECLARE FOREIGN_KEY_CURSOR CURSOR FOR
SELECT name FOREIGN_KEY_NAME FROM sys.foreign_keys WHERE parent_object_id = (SELECT object_id FROM sys.objects WHERE name = 'Table_Name' AND TYPE = 'U')

OPEN FOREIGN_KEY_CURSOR
----------------------------------------------------------
FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME
WHILE @@FETCH_STATUS = 0
    BEGIN
       DECLARE @DROP_COMMAND NVARCHAR(150) = 'ALTER TABLE Table_Name DROP CONSTRAINT' + ' ' + @FOREIGN_KEY_NAME

       EXECUTE Sp_executesql @DROP_COMMAND

       FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME

    END
-----------------------------------------------------------------------------------------------------------------
CLOSE FOREIGN_KEY_CURSOR
DEALLOCATE FOREIGN_KEY_CURSOR

Ответ 8

Используйте эти запросы, чтобы найти все FK:

Declare @SchemaName VarChar(200) = 'Schema Name'
Declare @TableName VarChar(200) = 'Table name'

-- Find FK in This table.
SELECT 
    'IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
      + ''') AND parent_object_id = OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' 
      + OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' +

    'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(FK.parent_object_id) +
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id)
FROM sys.foreign_keys AS FK
INNER JOIN Sys.objects As O 
  ON (O.object_id = FK.parent_object_id )
INNER JOIN SYS.schemas AS S 
  ON (O.schema_id = S.schema_id)  
WHERE 
      O.name = @TableName
      And S.name = @SchemaName


-- Find the FKs in the tables in which this table is used
  SELECT 
    ' IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
      + ''') AND parent_object_id = OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' 
      + OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' +

    ' ALTER TABLE ' +  OBJECT_SCHEMA_NAME(FK.parent_object_id) +
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id)
FROM sys.foreign_keys AS FK
INNER JOIN Sys.objects As O 
  ON (O.object_id = FK.referenced_object_id )
INNER JOIN SYS.schemas AS S 
  ON (O.schema_id = S.schema_id)  
WHERE 
      O.name = @TableName
      And S.name = @SchemaName 

Ответ 9

Вы должны рассмотреть (временно) отключение ограничения до полного его удаления.

Если вы посмотрите на TSQL создания таблицы, вы увидите что-то вроде:

ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint]

Вы можете запустить

ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint]

... затем вставьте/обновите кучу значений, которые нарушают ограничение, а затем верните его, запустив исходный оператор CHECK.

(Я должен был сделать это, чтобы очистить плохо разработанные системы, которые я унаследовал в прошлом.)

Ответ 10

Кроме того, вы также можете удалить ограничение внешнего ключа из самой SQL Server Management Studio. Вы можете попробовать, если команды не работают.

  • Разверните представление базы данных.
  • Щелкните правой кнопкой мыши на таблице, которая имеет ограничение внешнего ключа. Выберите "Дизайн". Откроется вкладка с информацией о столбцах таблицы.
  • Щелкните правой кнопкой мыши на столбце с ссылкой на внешний ключ. Или вы можете щелкнуть правой кнопкой мыши по любому столбцу. Выберите "Отношения".
  • В появившемся окне появится список отношений (если он у вас есть).
  • Оттуда вы можете удалить ограничение внешнего ключа.

Я надеюсь, что это поможет

Ответ 11

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

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'yourTableName'
AND COLUMN_NAME = 'yourColumnName';

А затем УДАЛИТЕ это с CONSTRAINT_NAME:

ALTER TABLE 'yourTableName'
DROP FOREIGN KEY 'nameOfConstraint';

Если вы хотите увидеть мой прежний вопрос:

не может удалить внешний ключ в MySQL

Ответ 12

alter table <referenced_table_name> drop  primary key;

Ограничение внешнего ключа будет удалено.