Como remover a restrição de chave estrangeira no servidor sql?
quero remover a chave estrangeira de outra tabela para poder inserir valores da minha escolha.
sou novo em bases de dados, por isso, por favor, diga-me a pesquisa SQL correcta para largar ou remover o valor da chave estrangeira.
11 answers
Tente seguir
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
É errado fazer isso em referência a integridade referencial , porque uma vez quebrado não é fácil ligá-lo de novo sem ter que passar pelos registos e apagar os que quebram as restrições.
De qualquer forma a sintaxe é a seguinte:
ALTER TABLE Tablename DROP CONSTRAINT ContName;
Ver MSDN:
Para remover todas as restrições do DB:
SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]
Mas, tenha cuidado, homem, uma vez que você faça isso, você pode nunca ter uma chance de volta, e você deve ler um livro de banco de dados básico para ver por que precisamos de chave estrangeira
Dependendo do DB Você está a usar há uma sintaxe ou outra.
Se estiver a utilizar Oracle tem de colocar o que os outros utilizadores lhe disseram:
ALTER TABLE table_name DROP CONSTRAINT fk_name;
Mas se usar o MySQL Então Isto dar-lhe-á um erro de sintaxe, em vez disso poderá escrever:
ALTER TABLE table_name DROP INDEX fk_name;
ALTER TABLE table
DROP FOREIGN KEY fk_key
Editar: não reparei que estavas a usar o servidor sql, erro meu
ALTER TABLE table
DROP CONSTRAINT fk_key
Largue todas as chaves estrangeiras de uma tabela:
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
Use essas consultas para encontrar todos os 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
Deve considerar (temporariamente) desactivar a restrição antes de a apagar completamente.
Se você olhar para a criação da tabela TSQL você vai ver algo como:
ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint]
Podes correr
ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint]
... em seguida, inserir/atualizar um monte de valores que violam a restrição, e, em seguida, voltar a ligá-lo, executando a instrução original CHECK
.
Em alternativa, também pode apagar uma restrição de chave estrangeira do próprio estúdio de gestão de servidores SQL. pode tentar se os comandos não funcionarem .
- expande a vista da base de dados.
- carregue com o botão direito na tabela que tem restrição de chave estrangeira. Escolha O Design. Irá abrir uma página com a informação acerca das colunas da tabela.
- carregue com o botão direito na coluna que tem a referência da chave estrangeira. Ou pode clicar com o botão direito em qualquer coluna. Escolhe As Relações.
- A uma lista de relações aparecerá (se você tiver uma) em uma janela pop up.
- de lá você pode apagar a restrição de chave estrangeira.
alter table <referenced_table_name> drop primary key;
A restrição de chave estrangeira será removida.