在不知道约束名称的情况下删除外键?

Won*_*ing 21 sql-server

我使用以下命令创建了一个表:

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)
);
Run Code Online (Sandbox Code Playgroud)

但现在我想放弃外键.由于我没有给出约束名称,我无法使用:

Alter table <tablename>
drop foreign key <foreign key name>
Run Code Online (Sandbox Code Playgroud)

有什么办法吗?请帮忙.

Lig*_*lb1 26

与Ed的答案类似,但您可以使用此选项根据表和列名称选择键名.

这样,您可以在脚本中运行它,也可以作为子查询来删除约束.

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME =  'post'
AND COLUMN_NAME =  'userID'
Run Code Online (Sandbox Code Playgroud)


Ed *_*ess 22

您可以在中找到约束的名称 INFORMATION_SCHEMA.TABLE_CONSTRAINTS

select CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Table1'
Run Code Online (Sandbox Code Playgroud)

  • 这给出了所有约束名称.如何获取特定字段的约束名称? (4认同)
  • 我们对彼得的问题有答案吗?我正在尝试做这样的事情:ALTER TABLE ef_jobpremium DROP CONSTRAINT &lt;DynamicWayToRetrieveConstraintName&gt;。希望我很清楚,我正试图在一次执行中做到这一点。 (2认同)

Sum*_*Guy 9

自从遇到一些陷阱后,扩大答案.另外,我声明了2个外键,所以我添加了一个可选的键来保存,如果它是null,它将被忽略:

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)
Run Code Online (Sandbox Code Playgroud)

  • 另外一个用于完整地回答问题.其他人都错过了实际丢弃的部分,SQL Server不允许参数化. (2认同)