【问题标题】:Firebird: Alter "anonymous" foreign keyFirebird:更改“匿名”外键
【发布时间】: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


【解决方案1】:

没有更好的办法,系统表是找出约束名称的唯一方法。

【讨论】:

  • 这是获取数据库结构信息的完全合法的方式。
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 2011-08-07
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多