Wie entferne ich die Fremdschlüsseleinschränkung in SQL Server?


Antworten:


150

Versuchen Sie Folgendes

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

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


1
Ich habe keinen Einschränkungsnamen hinzugefügt. Wie lösche ich diese Einschränkung?
Abhishek Goel

1
Auch wenn Sie den Einschränkungsnamen nicht angeben, weist SQL Server einen eindeutigen Einschränkungsnamen zu. Sie finden den Namen in SQL Management Studio.
Edward Olamisan

Sie können den Namen der Einschränkung natürlich auch finden, indem Sie \ d table_name in den Postgres-Befehlszeilenclient eingeben. Sieht normalerweise aus wie "fk ......."
Nytux

2
@Nytux Das OP gab eindeutig an, dass die Plattform MS SQL Server und nicht PostgreSQL ist (Tags und Fragentitel).
Alexandre

12

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

Auf jeden Fall lautet die Syntax wie folgt:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

Siehe MSDN:


Nein, die Syntax in SQL Server zum Löschen von Fremdschlüssel und Primärschlüssel ist dieselbe: alter table <Tabellenname> Drop Constraint <fk_or_pk_name>
Demoncodemonkey

5

So entfernen Sie alle Einschränkungen aus der Datenbank:

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

4
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

Aber seien Sie vorsichtig, Mann, wenn Sie das tun, werden Sie möglicherweise nie wieder eine Chance bekommen, und Sie sollten ein grundlegendes Datenbankbuch lesen, um herauszufinden, warum wir Fremdschlüssel benötigen


1
Er kann die Einschränkung einfach erneut hinzufügen, wenn er sie zurück haben möchte, solange die referenzielle Integrität noch vorhanden ist. Wenn nicht, muss das sowieso behoben werden.
Tobberoth

@Tobberoth, ja, das habe ich gemeint, danke, dass du es klar gemacht hast. In der realen Welt wird die meiste Zeit ein anderer Entwickler die Daten in der Tabelle durcheinander bringen, und Sie können die Einschränkung aufgrund dieser Daten dort nicht wieder hinzufügen.
Simon Wang

3

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

Sie sind falsch mit parent_object_id ... es sollte anstelle dieser referenzierten_object_id
udoline

2

Abhängig von der verwendeten Datenbank gibt es eine oder eine andere Syntax.

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;

1
ALTER TABLE table
DROP FOREIGN KEY fk_key

EDIT: habe nicht bemerkt, dass du SQL-Server benutzt, mein schlechtes

ALTER TABLE table
DROP CONSTRAINT fk_key

1

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

Wenn Sie sich die Tabellenerstellungs-TSQL ansehen, sehen Sie Folgendes:

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 erneut, indem Sie die ursprüngliche CHECKAnweisung ausführen.

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


1

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 mit Fremdschlüsseleinschränkung. 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 beliebige Spalte klicken. Wählen Sie Beziehungen.
  4. In einem Popup-Fenster wird eine Liste der Beziehungen angezeigt (falls vorhanden).
  5. Von dort aus können Sie die Fremdschlüsseleinschränkung löschen.

Ich hoffe das hilft


1

zuerst verwenden

show create table table_name;

um die beschreibende Struktur Ihrer Tabelle zu sehen.

Dort sehen Sie möglicherweise Einschränkungen für Fremdschlüssel, die Sie in dieser Tabelle verwendet haben. Löschen Sie zunächst die entsprechende Einschränkung mit

alter table table_name drop constraint constraint_name;

und löschen Sie dann die gewünschten Fremdschlüssel oder Spalten, die Sie wollten ... GoodLuck !!


1

Wenn Sie sich in einer Situation befinden, in der der FK-Name einer Tabelle automatisch generiert wurde und Sie nicht genau sehen können, was er ist (z. B. wenn Sie keine Rechte an einer Datenbank haben), können Sie Folgendes versuchen diese:

DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX);
SELECT @table = N'dbo.Table';
SELECT @sql = 'ALTER TABLE ' + @table
    + ' DROP CONSTRAINT ' + NAME + ';'
    FROM sys.foreign_keys
    WHERE [type] = 'F'
    AND [parent_object_id] = OBJECT_ID(@table);
EXEC sp_executeSQL @sql;

Erstellen Sie einen gespeicherten Prozess, der die Einschränkung der angegebenen Tabelle aufhebt, ohne den tatsächlichen FK-Namen anzugeben. Die Einschränkung wird gelöscht, wenn das Objekt [type]gleich F ist (Fremdschlüsseleinschränkung).

Hinweis : Wenn die Tabelle mehrere FKs enthält, werden alle gelöscht. Diese Lösung funktioniert also am besten, wenn die Tabelle, auf die Sie abzielen, nur einen FK hat.


0

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

Wenn Sie den Namen der Fremdschlüsseleinschränkung nicht kennen, versuchen Sie dies, um ihn zu finden.

sp_help 'TableName'   

zusätzlich für verschiedene schemata

sp_help 'schemaName.TableName'   

dann

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

0

Um auf der sicheren Seite zu sein, benennen Sie einfach alle Ihre Einschränkungen und notieren Sie sie im Kommentarbereich.

ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name

Wenn Sie vergessen haben, Ihre Einschränkung (en) zu benennen, gibt phpMyAdmin jeder Ihrer Einschränkungen, die Sie verwendet haben, einen eindeutigen Namen. So überprüfen Sie diesen eindeutigen Namen durch phpMyAdmin: Klicken Sie auf INFORMATION_SCHEMA und tippen Sie auf der linken Seite Ihrer Workbench. Scrollen Sie danach nach unten, suchen Sie TABLE_CONSTRAINTS und klicken Sie darauf. Dort sehen Sie alle Einschränkungen, die für die verschiedenen Spalten festgelegt wurden, sowie deren Namen und andere Details.
Agbesi Innocent

-6
alter table <referenced_table_name> drop  primary key;

Fremdschlüsseleinschränkungen werden entfernt.


Das Löschen des Primärschlüssels der referenzierten Tabelle ist möglicherweise der schlechteste Weg, um das Problem zu beheben. Oh, warte - das Löschen der referenzierten Tabelle selbst könnte schlimmer sein.
Brewmanz

Dies vermeidet das Wesentliche der gestellten Frage
Spencer Sullivan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.