【问题标题】:Oracle manually add an FK constraintOracle手动添加FK约束
【发布时间】:2011-02-16 06:44:50
【问题描述】:

好的,由于客户想要自动化某个过程,其中包括在 LIVE 数据库中创建新的键结构,我需要创建表之间的关系。列。 现在我找到了 ALL_CONS_COLS 和 USER_CONSTRAINTS 表来保存有关约束的信息。如果我要手动创建约束,通过插入这些表,我应该能够重新创建原始约束。 我的问题:我应该查看更多表格吗? 您是否有其他建议,因为这听起来很肮脏且容易出错。

目前的作案手法:

  • 在每个表中创建一个新列 PK;

  • 为此 PK 生成 guid;

  • 在每个表中创建一个新列 FK;

  • 获取与
    关联的 guid FK;

.......到目前为止完成......

  • 在旧约束的基础上添加新约束
    一个;

  • 移除旧约束;

  • 重命名新列;

这有点狡猾,我宁愿改变我的方法,任何想法都会有所帮助。

换句话说,客户希望在实时数据库上将密钥结构从 int 更改为 guid。解决这个问题的最佳方法是什么

【问题讨论】:

    标签: oracle guid key constraints manual


    【解决方案1】:

    首先,您不要通过弄乱数据字典来创建/修改/删除约束,而是使用常规的 ALTER TABLE t ADD/MODIFY/DROP CONSTRAINT 语法。

    在您的场景中,我认为您应该使用以下场景:

    1) 确保在此操作进行时没有人修改数据

    2) 首先删除旧的外键约束以避免名称与新约束冲突。

    3) 删除旧的主键约束

    4) 在 guid 列上创建新的主键约束

    5) 创建新的外键约束

    然后你就完成了。

    问候, 抢。

    【讨论】:

    • 好吧,ALTER TABLE 它是,但我如何去自动化它来复制现有的关系?我能想象的唯一方法是查询 all_cons_cols 和 user_constraints 表中的关系,为“新”列制作副本并删除“旧”列。
    • 创建一个为您生成命令的脚本。像“select 'alter table' || table_name || ' drop constraint ' || constraint_name || ';'从 user_constraints where constraint_type = 'P'" 删除所有主键。以及类似于删除外键并创建新约束的东西。
    • 所以我确实需要像现在一样使用 user_constraints 表;) 请记住,我们正在谈论一个带有记录的实时数据库。由于引用,DISABLE'ing 或 DROP'ing 将不容易实现。
    • 在哪些表中查看某个 PF 被引用为 FK 的最佳方法是什么。假设我有一个带有 'USER_ID' 的表 'USER' 作为 PK,我应该如何确定在哪些其他表中引用了 'USER_ID' 列。这样我就可以开始禁用“底部”的引用。
    • 嗯,客户有一个严格的命名约定,我可以在这里发挥我的优势。
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多