2012-09-19 30 views
46

Quiero eliminar la clave externa de otra tabla para poder insertar los valores que desee.¿Cómo eliminar la restricción de clave externa en el servidor sql?

Soy nuevo en las bases de datos así que por favor dígame la consulta sql correcta para soltar o quitar el valor de la clave foránea.

+21

Si es nuevo en las bases de datos, su primera reacción al encontrar una violación de clave externa no debe ser pensar "Voy a soltar la clave externa". –

+2

posible duplicado de [¿Cómo puedo soltar una clave externa en SQL Server?] (Http://stackoverflow.com/questions/93264/how-do-i-drop-a-foreign-key-in-sql-server) – Liam

Respuesta

96

intente seguir

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME> 

Consulte: http://www.w3schools.com/sql/sql_foreignkey.asp

+1

No he agregado ningún nombre de restricción. ¿Cómo elimino esa restricción? –

+1

Incluso si no especifica el nombre de restricción SQL Server asignará un nombre de restricción único. Puede encontrar el nombre con SQL Management Studio. –

+0

También puede encontrar el nombre de la restricción, por supuesto, escribiendo \ d table_name en el cliente de la línea de comando postgres. Por lo general, se ve como "fk ......." – Nytux

11

Es incorrecto hacer eso en referirse a referential integrity, porque una vez que está roto no es fácil volver a encenderlo sin tener que pasar por los registros y eliminar los que rompe las restricciones.

De todos modos la sintaxis es la siguiente:

ALTER TABLE Tablename DROP CONSTRAINT ContName; 

Ver MSDN:

+0

No, la sintaxis en SQL Server para descartar clave externa y clave principal es la misma: alterar tabla soltar restricción demoncodemonkey

1
ALTER TABLE table 
DROP FOREIGN KEY fk_key 

EDIT: no se dio cuenta que eras USI ng sql-servidor, mi mala

ALTER TABLE table 
DROP CONSTRAINT fk_key 
+0

Estoy usando SQL Server. –

+0

, así que me di cuenta :) – mokuril

4
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME] 

Pero, sea hombre cuidadoso, una vez que lo haces, puede que nunca tengan la oportunidad de vuelta, y usted debe leer algún libro base de datos básica vemos por qué necesitamos clave externa

+1

Puede agregar la restricción nuevamente si la quiere, siempre y cuando la integridad referencial aún esté allí. Si no es así, eso tiene que ser arreglado de todos modos. – Tobberoth

+0

@Tobberoth, sí, eso es lo que quise decir, gracias por dejarlo en claro. En el mundo real, la mayoría de las veces, algún otro desarrollador desordene los datos en la tabla y no puede agregar la restricción debido a esos datos allí. –

4

Para eliminar todo el las limitaciones de la base de datos:

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

Uso esas consultas para encontrar todas las claves ajenas:

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 
0

Se deben considerar (temporalmente) la desactivación de la limitación antes de eliminar por completo.

Si nos fijamos en la creación de la tabla de TSQL verá algo como:

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

Puede ejecutar

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

... a continuación, insertar/actualizar un grupo de valores que violan la restricción y vuelva a encenderlo ejecutando la instrucción original CHECK.

(he tenido que hacer esto para la limpieza de sistemas mal diseñados que he heredado en el pasado.) Será eliminado

-3
alter table <referenced_table_name> drop primary key; 

restricción de clave externa.

+0

Quitar la tecla principal de la tabla a la que se hace referencia es quizás la peor forma de intentar solucionar el problema. Oh, espera: dejar caer la tabla referenciada podría ser peor. – brewmanz

0

Alternativamente, también puede eliminar una restricción de clave externa desde el mismo SQL Server Management Studio. Puede intentarlo si los comandos no funcionan.

  1. Amplíe la vista de su base de datos.
  2. Haga clic derecho en la tabla que tiene restricción de clave externa. Elija Diseño. Se abrirá una pestaña con la información sobre las columnas de la tabla.
  3. Haga clic derecho en la columna que tiene la referencia de la clave externa. O puede hacer clic derecho en cualquier columna. Elija relaciones.
  4. Aparecerá una lista de relaciones (si tiene una) en una ventana emergente.
  5. Desde allí puede eliminar la restricción de clave externa.

Yo espero que ayude

0

Dependiendo del DB que está utilizando no hay una sintaxis u otra.

Si está utilizando Oracle usted tiene que poner lo que los otros usuarios que dijeron:

ALTER TABLE table_name DROP CONSTRAINT fk_name; 

Pero si utiliza MySQL entonces esto le dará un error de sintaxis, en lugar usted puede escribir :

ALTER TABLE table_name DROP INDEX fk_name; 
1

gota todas las claves foráneas de una tabla:

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 
Cuestiones relacionadas