如果我不知道 table 是否存在,如何确保外键约束不存在?

How can I ensure a foreign key constraint doesn't exist, if I don't know whether the table exists?

如果我知道 table 存在但我不知道外键约束是否存在,那么我可以这样做:

ALTER TABLE table_name DROP CONSTRAINT IF EXISTS constraint_name

如果我不知道 table 本身是否存在怎么办?我想要一个 单一语句 结果如下:

if (the table does not exist)
{
    nothing happens
}
else if (the table exists, but the foreign key constraint does not exist)
{
    nothing happens
}
else
{
    the foreign key constraint is dropped, but the table continues to exist
}

就您的问题而言,正如 Dale K 所评论的那样,您不能在一条语句中做到这一点。

相反,一种选择是在尝试删除约束之前首先检查 catalog table information_schema.referential_constraints 约束是否存在,例如:

if (exists (
    select 1
    from information_schema.referential_constraints 
    where constraint_name  = 'myconstraint'
))
begin
    alter table mytable drop constraint myconstraint;
end

如果table不存在,则if条件不成立,alter table语句不会运行。

请注意,您可能希望在 referential_constraintsconstraint_schema 列上添加过滤器(因为不同模式中可能存在相同名称的约束)。