2009-05-05 11 views
15

Ich habe eine Tabelle unten Befehl erstellt mit:Drop Foreign Key ohne den Namen der Einschränkung zu kennen?

create table Table1(
    Id int Not Null 
     Foreign key 
     references Table2(Id) 
     on delete cascade 
     on update cascade, 
    UserName nvarchar(150), 
    TimeInSeconds int Not Null 

    primary key(Id,TimeInSeconds) 
); 

Aber jetzt will ich den Fremdschlüssel fallen zu lassen. Wie ich Constraintname gegeben haben kann ich nicht verwenden:

Alter table <tablename> 
drop foreign key <foreign key name> 

Gibt es eine Möglichkeit? Bitte helfen.

Antwort

20

Sie können den Namen der Einschränkung in INFORMATION_SCHEMA.TABLE_CONSTRAINTS

select CONSTRAINT_NAME 
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
where TABLE_NAME = 'Table1' 
+0

+1. Schnelle Zeichnung. Ich wollte: Wählen Sie * aus syscontraints wo xtype = 'F' und Name wie '% table1%' –

+0

Mit Ausnahme, was passiert, wenn Sie dies in einem Skript für mehrere Datenbanken, die das gleiche Schema daher den Namen von haben sollte Die Einschränkung ist möglicherweise bei jeder Instanz der Datenbank unterschiedlich? In diesem Fall wird das nicht funktionieren. – Peter

+0

@Peter, idealerweise hätten Sie Constraints benannt, aber wenn Sie nicht, können Sie immer noch die Namen zur Skriptlaufzeit bekommen. Sehe kein Problem. –

0

finden, wenn Sie sich an den Tisch in Enterprise Manager/Management Studio werden Sie sehen nur in der Lage sein, die Liste der Schlüssel, um zu sehen und es von dort zu löschen.

-2

können Sie setzen:

> show create table Tabellenname;

Sie sehen, wie die Tabelle erstellt wurde ... Spalten, Typen ... etc. und Sie können Ihren Constraint-Namen sehen.

+1

'SHOW CREATE TABLE Tabellenname;' ist ein MySQL-spezifischer Befehl. Diese Frage bezieht sich auf Microsoft SQL Server, ein völlig anderes Produkt. – Raystorm

21

Entspricht der Antwort von Ed, aber Sie können damit den Schlüsselnamen anhand des Tabellen- und Spaltennamens auswählen.

Auf diese Weise können Sie es in einem Skript oder möglicherweise als Unterabfrage ausführen, um die Einschränkung zu löschen.

4

Erweitern Sie auf die Antworten, seit ich in einige Gotchas geriet. Außerdem hatte ich zwei Fremdschlüssel deklariert, so fügte ich einen optionalen Schlüssel zu halten, wenn es null ist, es wird einfach ignoriert werden:

declare @name varchar(255), 
    @table varchar(255) = 'mytable', 
    @column varchar(255) = 'mykeycolumn', 
    @validkey varchar(255) = 'mykeyIwanttokeep' 

SELECT @name = CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @table 
    AND COLUMN_NAME = @column 
    AND (CONSTRAINT_NAME != @validkey or @validkey is null) 

declare @sql varchar(1023) = 'alter table ' + @table + ' drop ' + @name 

exec (@sql) 
+1

AND COLUMN_NAME = ** @ Spalte ** –

+0

danke, aktualisierte es – SumGuy

+0

Plus eins für die Beantwortung der Frage in seiner Gesamtheit. Alle anderen haben den Teil des tatsächlichen Ablegens verpasst, den SQL Server nicht parametrisieren kann. –

1

A SQL Server Option:

DECLARE @foreignkey varchar(100) 
DECLARE @tablename varchar(100) 
DECLARE @command nvarchar(1000) 

DECLARE db_cursor CURSOR FOR 
SELECT fk.name, t.name 
FROM sys.foreign_keys fk 
JOIN sys.tables t ON t.object_id = fk.parent_object_id 
WHERE t.name IN (
    'table_1_name_here', 
    'table_2_name_here' 
) 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @command = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @foreignkey 
    EXECUTE(@command) 
    FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 

Die SQL wählt alle Einschränkungen für die Tabellen, die Sie interessieren, in einen Cursor und löscht sie nacheinander. Alles, was Sie wissen müssen, sind die Namen der Tabellen, aus denen sie gelöscht werden sollen.

Verwandte Themen