web-dev-qa-db-fra.com

Comment supprimer la contrainte de clé étrangère sur le serveur SQL?

Je veux supprimer la clé étrangère d'une autre table pour pouvoir insérer les valeurs de mon choix.

Je suis nouveau dans les bases de données, merci de me dire si la requête SQL est correcte pour supprimer ou supprimer la valeur de la clé étrangère.

63
Ammar Asjad

Essayez de suivre

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

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

127
Prasanna

Son tort de faire cela en référence à intégrité référentielle , car une fois qu'il est cassé, il n'est pas facile de le réactiver sans devoir parcourir les enregistrements et supprimer ceux qui rompent les contraintes.

Quoi qu'il en soit, la syntaxe est la suivante:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

Voir MSDN:

11
CloudyMarble

Pour supprimer toutes les contraintes de la base de données:

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

Mais, mec prudent, une fois que vous faites cela, vous pouvez ne jamais avoir une chance de revenir, et vous devriez lire un livre de base de base de données voir pourquoi nous avons besoin d'une clé étrangère

4
Simon Wang

En fonction de DB, vous utilisez une syntaxe ou une autre.

Si vous utilisez Oracle vous devez mettre ce que les autres utilisateurs vous ont dit:

ALTER TABLE table_name DROP CONSTRAINT fk_name;

Mais si vous utilisez MySQL alors cela vous donnera une erreur de syntaxe, vous pouvez plutôt taper:

ALTER TABLE table_name DROP INDEX fk_name;
2
Guim Gonzalez
ALTER TABLE table
DROP FOREIGN KEY fk_key

EDIT: n'a pas remarqué que vous utilisiez SQL Server, mon mauvais

ALTER TABLE table
DROP CONSTRAINT fk_key
1
mokuril

Vous devez envisager (temporairement) de désactiver la contrainte avant de la supprimer complètement.

Si vous regardez la création de table TSQL, vous verrez quelque chose comme:

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

Tu peux courir

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

... puis insérez/mettez à jour un ensemble de valeurs qui violent la contrainte, puis réactivez-le en exécutant l'instruction originale CHECK.

(J'ai dû le faire pour nettoyer des systèmes mal conçus dont j'ai hérité par le passé.)

1
feetwet

Déposez toutes les clés étrangères d'une table:

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
1
Ashraf

Utilisez ces requêtes pour trouver tous les 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 
0
Ardalan Shahgholi

Vous pouvez également supprimer une contrainte de clé étrangère de SQL Server Management Studio. Vous pouvez l'essayer si les commandes ne fonctionnent pas.

  1. Développez votre vue de base de données.
  2. Clic droit sur la table qui a la contrainte de clé étrangère. Choisissez la conception. Un onglet contenant les informations sur les colonnes de la table s'ouvrira.
  3. Cliquez avec le bouton droit sur la colonne contenant la référence de clé étrangère. Ou vous pouvez faire un clic droit sur n'importe quelle colonne. Choisissez les relations.
  4. Une liste de relations apparaîtra (si vous en avez une) dans une fenêtre contextuelle.
  5. De là, vous pouvez supprimer la contrainte de clé étrangère.

J'espère que ça aide

0
alchi baucha