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.
Versuchen Sie folgendes
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
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:
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, 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
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;
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
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.)
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
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
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