11 ответов:
неправильно это делать в ссылке целостность, потому что после того, как его сломали его не так легко включить его снова без необходимости проходить через записи и удалять те, которые нарушает ограничения.
в любом случае синтаксис выглядит следующим образом:
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_keyEDIT: не заметил, что вы используете 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. вы можете попробовать, если команды не работают.
- разверните представление базы данных.
- Правой Кнопкой Мыши на таблице, которая имеет ограничение внешнего ключа. Выберите Дизайн. Откроется вкладка с информацией о столбцах таблицы.
- щелкните правой кнопкой мыши на столбце, который имеет ссылку на внешний ключ. Или вы можете щелкнуть правой кнопкой мыши на любом столбце. Выбирать Отношения.
- список отношений появится (если у вас есть один) во всплывающем окне.
- оттуда вы можете удалить ограничение внешнего ключа.
Я надеюсь, что это поможет
Comments