Ich möchte einen 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 richtige SQL-Abfrage mit, um den Fremdschlüsselwert zu löschen oder zu entfernen.
sql-server
database
foreign-keys
Ammar Asjad
quelle
quelle
Antworten:
Versuchen Sie Folgendes
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
Siehe: http://www.w3schools.com/sql/sql_foreignkey.asp
quelle
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:
quelle
So entfernen Sie alle Einschränkungen aus der Datenbank:
SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name FROM Information_Schema.CONSTRAINT_TABLE_USAGE
quelle
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
quelle
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
quelle
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;
quelle
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
quelle
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
CHECK
Anweisung ausführen.(Ich musste dies tun, um schlecht gestaltete Systeme zu bereinigen, die ich in der Vergangenheit geerbt habe.)
quelle
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 .
Ich hoffe das hilft
quelle
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 !!
quelle
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.
quelle
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
quelle
Wenn Sie den Namen der Fremdschlüsseleinschränkung nicht kennen, versuchen Sie dies, um ihn zu finden.
zusätzlich für verschiedene schemata
dann
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
quelle
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
quelle
alter table <referenced_table_name> drop primary key;
Fremdschlüsseleinschränkungen werden entfernt.
quelle