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

Nor*_*ert 2 sql firebird alter-table subquery

我有一个firebird数据库模式,由各种CREATE TABLE脚本设置.这些脚本已被提交到源控制系统(参见Scott Allen的站点).

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

ALTER TABLE myTable DROP CONSTRAINT c
Run Code Online (Sandbox Code Playgroud)

约束的名称(例如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'
Run Code Online (Sandbox Code Playgroud)

这些陈述可以合并为一个ALTER命令吗?

Hug*_*hem 6

我建议你看一下EXECUTE STATEMENT.

这里是火鸟常见问题

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;
Run Code Online (Sandbox Code Playgroud)