Firebird SQL:ALTER语句中的子查询?

时间:2011-06-17 09:35:50

标签: sql subquery firebird alter-table

我有一个firebird数据库架构,它由各种CREATE TABLE脚本设置。这些脚本已提交到源控制系统(请参阅Scott Allen's站点)。

现在我想创建一个新脚本,我希望我的数据库删除特定表中一列的NOT NULL约束:

ALTER TABLE myTable DROP CONSTRAINT c

可以通过查询系统表来获取约束的名称(例如INTEG_219):

SELECT rc.rdb$constraint_name
FROM   rdb$relation_constraints rc
       join rdb$check_constraints cc
       on rc.rdb$constraint_name = cc.rdb$constraint_name
WHERE  rc.rdb$constraint_type   = 'NOT NULL'
       and rc.rdb$relation_name = 'MYTABLE'
       and cc.rdb$trigger_name  = 'ACOLUMN'

这些语句可以组合成一个ALTER命令吗?

2 个答案:

答案 0 :(得分:6)

我建议你看看EXECUTE STATEMENT

并在firebird faq

execute BLOCK 
as declare variable stmt VARCHAR(2500) = 'SELECT ''ALTER TABLE MYTABLE myTable DROP CONSTRAINT ''|| rc.rdb$constraint_name||'';'' FROM   rdb$relation_constraints rc
           join rdb$check_constraints cc
           on rc.rdb$constraint_name = cc.rdb$constraint_name WHERE  rc.rdb$constraint_type   = ''NOT NULL''
           and rc.rdb$relation_name = ''MYTABLE''
           and cc.rdb$trigger_name  = ''ACOLUMN'''; 
begin   
  execute STATEMENT stmt; 
end;

答案 1 :(得分:0)

这个答案是基于Hughes Van Landeghem的回答和Norbert对这个答案的回答,所以请不要投票赞成:)

execute BLOCK 
as 
    declare variable stmt VARCHAR(2500); 
    declare variable cname varchar(255);
begin
    SELECT rc.rdb$constraint_name
        FROM   rdb$relation_constraints rc
               join rdb$check_constraints cc
               on rc.rdb$constraint_name = cc.rdb$constraint_name
        WHERE  rc.rdb$constraint_type   = 'NOT NULL'
               and rc.rdb$relation_name = 'MYTABLE'
               and cc.rdb$trigger_name  = 'ACOLUMN'
        INTO :cname;
    stmt = 'alter table myTable drop constraint ' || cname;
    execute STATEMENT stmt; 
end;

我也在使用Firebird 2.5并且无法获得Hughes Van Landeghem的原始答案。我收到的错误是找不到错误代码335544928的消息,我认为它与嵌入式选择有关。