【发布时间】:2014-11-11 09:42:54
【问题描述】:
我需要将现有外键从“删除限制”更改为“删除级联”。不幸的是,这个错误在 Q/A 中偷偷溜走了。
在我的数据库中,我有几个自动命名的外键关系(INTEG_1、INTEG_2、...)。我必须修复的约束名称在新安装中是另一个名称,而不是版本 2 的更新中的名称,甚至与此版本 2 之前从版本 1 更新时的名称不同。
由于引用表只有一个外键,这个语句给了我约束的名字:
SELECT RDB$CONSTRAINT_NAME
FROM RDB$RELATION_CONSTRAINTS
where RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
and RDB$RELATION_NAME = 'MY_TABLE_NAME'
然后我可以删除并重新创建外键(这次使用“真实”名称)
alter table MY_TABLE_NAME
drop constraint <result from above>;
alter table MY_TABLE_NAME
add constraint fk_my_table_name_purpose foreign key (other_id)
references other_table(id) on delete cascade;
但是,我尽量避免直接使用系统表,我想知道是否有更好/更优雅的方式来更改我的外键。
【问题讨论】:
-
"尽量避免直接使用系统表" - 为什么?这是检索此类信息的官方“API”(因为 Firebird 没有标准
INFORMATION_SCHEMA) -
我将系统表视为可以与之交互的数据库内部的东西,但不应该(如果可能的话)。但是如果我的解决方案已经是“官方方式”......很好:-)
-
不直接使用系统表的建议是关于修改系统表。在 Firebird 中,技术上可以通过插入、更新或删除系统表中的项目来执行某些形式的 DDL。这有其自身的一系列问题,因此 Firebird 3 将使这成为不可能(除了少数例外)。
标签: sql foreign-keys firebird firebird2.5