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

Prasanna
quelle
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:

CloudyMarble
quelle
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
Sakthivel Murugesan
quelle
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

Simon Wang
quelle
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
Ashraf
quelle
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;
gtech
quelle
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
Mokuril
quelle
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.)

Fußnass
quelle
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

alchi baucha
quelle
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 !!

Jay Adikary
quelle
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.

SandsturmNick
quelle
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 
Ardalan Shahgholi
quelle
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>
Ritterkämpfer
quelle
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
Agbesi Innocent
quelle
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.

user6882476
quelle
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