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.
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.
Antworten:
Versuchen Sie Folgendes
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
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:
So entfernen Sie alle Einschränkungen aus der Datenbank:
SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
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
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
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;
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.)
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
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 !!
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.
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
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>
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
alter table <referenced_table_name> drop primary key;
Fremdschlüsseleinschränkungen werden entfernt.