gpt4 book ai didi

sql - 如何更改 Firebird 上的 CHECK 约束?

转载 作者:行者123 更新时间:2023-12-01 00:56:06 25 4
gpt4 key购买 nike

我有一个像这样的 Firebird 表:

CREATE TABLE events (
event VARCHAR(6) NOT NULL
CHECK (event IN ('deploy', 'revert', 'fail')),
change_id CHAR(40) NOT NULL,
change VARCHAR(512) NOT NULL
);

现在我需要为 IN() 添加另一个值CHECK 约束中的列表。我怎么做?

到目前为止我尝试过的事情:
  • 更新 RDB$TRIGGERS.RDB$TRIGGER_SOURCE 中的值:
    UPDATE RDB$TRIGGERS
    SET RDB$TRIGGER_SOURCE = 'CHECK (event IN (''deploy'', ''revert'', ''fail'', ''merge''))'
    WHERE RDB$TRIGGER_SOURCE = 'CHECK (event IN (''deploy'', ''revert'', ''fail''))';

    似乎不起作用,因为触发器是在 RDB$TRIGGERS.RDB$TRIGGER_BLR 中编译的.
  • 创建一个带有新检查的新表,复制数据,删除旧表并重命名新表。然而,似乎一个cannot rename a Firebird table ,所以我不能让新表与旧表同名。

  • 我怀疑更新 RDB$TRIGGERS是要走的路(idk!),如果我能让 Firebird 重新编译代码就好了。但也许有更好的方法?

    最佳答案

    您需要删除并重新创建检查约束。

    由于您没有为约束指定名称,Firebird 创建了一个名称,因此您首先需要找到该名称:

    select trim(cc.rdb$constraint_name), trg.rdb$trigger_source 
    from rdb$relation_constraints rc
    join rdb$check_constraints cc on rc.rdb$constraint_name = cc.rdb$constraint_name
    join rdb$triggers trg on cc.rdb$trigger_name = trg.rdb$trigger_name
    where rc.rdb$relation_name = 'EVENTS'
    and rc.rdb$constraint_type = 'CHECK'
    and trg.rdb$trigger_type = 1;

    我只是出于信息原因添加了触发源。

    一旦你有了名字,你就可以删除它,例如
    alter table events drop constraint integ_27;

    然后添加新约束:
    alter table events 
    add constraint check_event_type
    CHECK (event IN ('deploy', 'revert', 'fail', 'merge'));

    将来您不需要查找约束名称,因为您已经找到了。

    关于sql - 如何更改 Firebird 上的 CHECK 约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829314/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com