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



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



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

991   11  

11 ответов:

попробовать следующие

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

см.:http://www.w3schools.com/sql/sql_foreignkey.asp

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

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

ALTER TABLE Tablename DROP CONSTRAINT ContName;

см. MSDN:

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

SELECT 'ALTER TABLE ' + Table_Name  +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

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

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

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

ALTER TABLE table_name DROP CONSTRAINT fk_name;

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

ALTER TABLE table_name DROP INDEX fk_name;
ALTER TABLE table
DROP FOREIGN KEY fk_key

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

ALTER TABLE table
DROP CONSTRAINT fk_key

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

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

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

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 

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

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

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

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

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

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

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

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

  1. разверните представление базы данных.
  2. Правой Кнопкой Мыши на таблице, которая имеет ограничение внешнего ключа. Выберите Дизайн. Откроется вкладка с информацией о столбцах таблицы.
  3. щелкните правой кнопкой мыши на столбце, который имеет ссылку на внешний ключ. Или вы можете щелкнуть правой кнопкой мыши на любом столбце. Выбирать Отношения.
  4. список отношений появится (если у вас есть один) во всплывающем окне.
  5. оттуда вы можете удалить ограничение внешнего ключа.

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

alter table <referenced_table_name> drop  primary key;

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

Comments

    Ничего не найдено.