如果我不知道 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_constraints
的 constraint_schema
列上添加过滤器(因为不同模式中可能存在相同名称的约束)。
如果我知道 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_constraints
的 constraint_schema
列上添加过滤器(因为不同模式中可能存在相同名称的约束)。