2009-05-05 144 views
15

我已創建使用下面的命令一個表:在不知道約束名稱的情況下刪除外鍵?

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) 
); 

但現在我要刪除的外鍵。 由於我還沒有給定約束的名字我不能使用:

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

有什麼辦法?請幫助。

回答

20

可以在INFORMATION_SCHEMA.TABLE_CONSTRAINTS

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

+1。快速繪製。我想要的是:select * from syscontraints其中xtype ='F'並且名稱如'​​%table1%' – 2009-05-05 12:22:47

+0

除非在腳本中執行此操作以釋放多個應具有相同模式的數據庫,否則會發生這種情況該約束對於數據庫的每個實例可能會有所不同?在這種情況下,這是行不通的。 – Peter 2011-09-28 09:31:58

+0

@Peter,理想情況下你可以命名約束,但是如果你不這樣做,你仍然可以在腳本運行時獲得名稱。沒有看到問題。 – 2012-02-14 15:49:44

0

找到約束的名稱。如果你只是看一下表在企業管理器/ Management Studio中,你將能夠看到密鑰列表中,並從那裏刪除它。

-2

你可以把:

>顯示創建表的表名;

您將看到如何創建表...列,類型等。你可以看到你的約束名稱。

21

與Ed的答案類似,但您可以使用它來根據表和列名稱選擇鍵名稱。

通過這種方式,您可以在腳本中運行它,也可以作爲子查詢來刪除約束。

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'post' 
AND COLUMN_NAME = 'userID' 
4

自從遇到一些疑難解答後,我就擴大了答案。另外,我有2個外鍵聲明,所以我加了一個可選的鍵保存,如果是零它只會被忽略:

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

一個SQL Server選項:

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 

的SQL選擇您關心的表格的所有約束放入一個光標並逐個放下。所有你需要知道的是你想讓它們丟棄的表的名字。

相關問題