2009-05-05 110 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选择您关心的表格的所有约束放入一个光标并逐个放下。所有你需要知道的是你想让它们丢弃的表的名字。

相关问题