web-dev-qa-db-de.com

So entfernen Sie Fremdschlüsseleinschränkungen in SQL Server?

Ich möchte Fremdschlüssel aus einer anderen Tabelle entfernen, damit ich Werte meiner Wahl einfügen kann.

Ich bin neu in Datenbanken. Bitte teilen Sie mir die korrekte SQL-Abfrage zum Löschen oder Entfernen des Fremdschlüsselwerts mit.

63
Ammar Asjad

Versuchen Sie folgendes

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

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

127
Prasanna

Es ist falsch, dies in Bezug auf referentielle Integrität zu tun, da es nicht einfach ist, es wieder einzuschalten, wenn es einmal kaputt ist, ohne die Datensätze durchgehen und die Datensätze löschen zu müssen, die die Einschränkungen aufheben.

Wie auch immer, die Syntax lautet wie folgt:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

Siehe MSDN:

11
CloudyMarble

So entfernen Sie alle Einschränkungen aus der Datenbank:

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

Aber seien Sie vorsichtig, wenn Sie das tun, erhalten Sie möglicherweise nie eine Chance zurück, und Sie sollten ein grundlegendes Datenbankbuch lesen, um herauszufinden, warum wir einen Fremdschlüssel benötigen

4
Simon Wang

Abhängig von der DB , die Sie verwenden, gibt es eine Syntax oder eine andere.

Wenn Sie Oracle verwenden, müssen Sie angeben, was die anderen Benutzer Ihnen gesagt haben:

ALTER TABLE table_name DROP CONSTRAINT fk_name;

Wenn Sie jedoch MySQL verwenden, erhalten Sie einen Syntaxfehler. Stattdessen können Sie Folgendes eingeben:

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

EDIT: habe nicht bemerkt, dass Sie SQL-Server verwenden, meine schlechte

ALTER TABLE table
DROP CONSTRAINT fk_key
1
mokuril

Sie sollten die Einschränkung (vorübergehend) deaktivieren, bevor Sie sie vollständig löschen.

Wenn Sie sich die Tabellenerstellung von TSQL ansehen, werden Sie folgendes sehen:

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

Du kannst rennen

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

... fügen Sie dann eine Reihe von Werten ein, die gegen die Einschränkung verstoßen, und aktivieren Sie sie wieder, indem Sie die ursprüngliche CHECK -Anweisung ausführen.

(Ich musste dies tun, um schlecht gestaltete Systeme zu bereinigen, die ich in der Vergangenheit geerbt habe.)

1
feetwet

Löschen Sie alle Fremdschlüssel einer Tabelle:

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

Verwenden Sie diese Abfragen, um alle FKs zu finden:

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

Alternativ können Sie auch eine Fremdschlüsseleinschränkung aus dem SQL Server Management Studio selbst löschen. Sie können es versuchen, wenn die Befehle nicht funktionieren.

  1. Erweitern Sie Ihre Datenbankansicht.
  2. Klicken Sie mit der rechten Maustaste auf Tabelle, für die eine Fremdschlüsselbeschränkung gilt. Wählen Sie Design. Eine Registerkarte mit Informationen zu Tabellenspalten wird geöffnet.
  3. Klicken Sie mit der rechten Maustaste auf die Spalte mit der Fremdschlüsselreferenz. Oder Sie können mit der rechten Maustaste auf eine Spalte klicken. Wählen Sie Beziehungen.
  4. In einem Popup-Fenster wird (falls vorhanden) eine Liste mit Beziehungen angezeigt.
  5. Von dort aus können Sie die Fremdschlüsseleinschränkung löschen.

Ich hoffe das hilft

0
alchi baucha