Я хочу удалить внешний ключ из другой таблицы, чтобы я мог вставлять значения по своему выбору.
Я новичок в базах данных, поэтому, пожалуйста, скажите мне правильный SQL-запрос, чтобы удалить или удалить значение внешнего ключа.
Я хочу удалить внешний ключ из другой таблицы, чтобы я мог вставлять значения по своему выбору.
Я новичок в базах данных, поэтому, пожалуйста, скажите мне правильный SQL-запрос, чтобы удалить или удалить значение внешнего ключа.
Попробуйте выполнить
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
Обратитесь: http://www.w3schools.com/sql/sql_foreignkey.asp
Неправильно это сделать, ссылаясь на ссылочную целостность, потому что, как только его сломать, нелегко включить его снова, не пройдя через записи и удалить те, которые нарушают ограничения.
В любом случае синтаксис выглядит следующим образом:
ALTER TABLE Tablename DROP CONSTRAINT ContName;
См. MSDN:
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]
Но будьте осторожны, когда вы это сделаете, вы никогда не получите шанс вернуться, и вы должны прочитать некоторую базовую книгу базы данных, чтобы узнать, зачем нам нужен внешний ключ
Чтобы удалить все ограничения из БД:
SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
В зависимости от 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
Используйте эти запросы, чтобы найти все 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
Вы должны рассмотреть (временно) отключение ограничения до полного его удаления.
Если вы посмотрите на 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. Вы можете попробовать, если команды не работают.
Я надеюсь, что это поможет
Я также новичок в базе данных, но у меня был похожий вопрос. Если вы не знаете своего имени ограничения, вы можете попробовать это:
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';
Если вы хотите увидеть мой прежний вопрос:
alter table <referenced_table_name> drop primary key;
Ограничение внешнего ключа будет удалено.